2015-02-19  C/C++ プログラミング

Visual Studio 2012 __cplusplus が必ず定義されてしまう不具合

Visual Studio

Java Native Interface JNI 用の DLL Visual Studio 2012 で作成していたときのことです。IntelliSense 式にはポインター型が必要です というエラーメッセージを出力するので悩んでしまいました。ビルドは成功するのですが なぜかインテリセンスのエラーが消えません。

原因を調べてみると Visual Studio 2012 の不具合であるということが分かりました。

Java Native Interface(JNI)の使い方

Java Native Interface JNI C C++のどちらでも使用することができます。C C++では少し記述が異なります。たとえば Java VM のバージョンを取得する GetVersion を呼び出す場合のコードは以下のようになります。

C++ の場合
env->GetVersion();
C の場合
(*env)->GetVersion(env);

C++ ではなく C で JNI を使用すると…

Visual Studio 2012 C++ではなく C JNI を使用すると以下のように IntelliSense: 式にはポインター型が必要です というエラーメッセージが表示されてしまいます。

原因を調べみると どうやら C でコードを書いているにも関わらず __cplusplus マクロが常に定義されてしまっているようです。試しに以下のようなコードを書いてみると 確かに __cplusplus マクロが定義されていることが分かります。

既定の設定ではソースコードの拡張子が .cpp であれば C++ 拡張子が .c であれば C としてコンパイルされます。C としてコンパイルされる場合は __cplusplus マクロは定義されないはずなのですが…。

もうひとつ プロジェクトの構成プロパティ C/C++ 詳細設定 コンパイル言語の選択 で明示的に C C++のどちらでコンパイルするかを指定することができます。Visual Studio 2012 では C コードとしてコンパイル を指定しても __cplusplus マクロが定義されてしまいます。

マイクロソフトのエンジニアもこの不具合を認識していますが Visual Studio 2012 のアップデートで修正することが難しいらしく 新しい Visual Studio のバージョンを使用してくれ と言っています。

Visual Studio 2013 では不具合が修正されていました

Visual Studio 2013 で試してみたところ C の場合は __cplusplus マクロが定義されなくなり IntelliSense: 式にはポインター型が必要です というエラーも表示されなくなりました。

ずいぶんと悩んだのに Visual Studio のバグだったなんて…。脱力してしまいました。このようなバグがあっても大きな問題にならないというのは みんな C++でコードを書いていて C を使っていないということなのかもしれないですね。ちょっと寂しいです。

ちなみに この不具合は Visual Studio 2010 にもあるそうです。2005 は問題なし。2008 は未確認です。

最終更新日 2024-12-12
この記事を共有しませんか?
ブックマーク ポスト