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 は未確認です。