.cppファイルでマクロを使用しmmData1
ます。プロジェクトで検索したところ、このマクロが複数のファイルで定義されていることがわかりました(つまり、次の行を持つ.hファイルがいくつかあります#define mmData1
) 。
プリプロセッサがマクロ値を取得するファイルを確認する機能がVS10にあるかどうかを知りたい
.cppファイルでマクロを使用しmmData1
ます。プロジェクトで検索したところ、このマクロが複数のファイルで定義されていることがわかりました(つまり、次の行を持つ.hファイルがいくつかあります#define mmData1
) 。
プリプロセッサがマクロ値を取得するファイルを確認する機能がVS10にあるかどうかを知りたい
Intellisense が認識しない場合、直接的な方法はありません。ただし、間接的な方法もあります。あなたのマクロ名がSOME_MACRO
#define SOME_MACRO
putの各インスタンスの後#error Defined here
、ソース ファイルを右クリックして を選択しますCompile
。コンパイラがエラーを返した場合は、エラーを発生させたディレクティブを削除して、再度コンパイルします。このエラーの最後のインスタンスは、ソースに表示されている定義の末尾になります。
各ディレクティブ定義をSOME_MACRO
別のものとして定義し、ソース ファイルで、すべてのインクルードの後に次の行を追加します。
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO))
ソース ファイルをコンパイルします。ビルド ログに値が表示されます。
邪魔にならない方法: これらの行をそれぞれの後に置きます#define SOME_MACRO
#pragma push_macro("STRINGIZE")
#pragma push_macro("STRINGIZE2")
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#pragma message("Defining at " __FILE__ ":" STRINGIZE(__LINE__))
#pragma pop_macro("STRINGIZE")
#pragma pop_macro("STRINGIZE2")
または、行番号が必要ない場合:
#pragma message("Defining at " __FILE__)
ファイルをコンパイルします。ビルド ログを見ると、SOME_MACRO
定義の順序がわかります。
プリプロセッサが何をしているかを正確に確認する最善の方法は、その出力を直接調べることです。 インテリセンスは役に立ちますが、多くの場合、コンパイラが理解するものと一致しません。
私がいつも使っている簡単なトリックは、チェックしたい行でマクロを再定義することです。コードをコンパイルすると、プリプロセッサは文句を言って、以前の定義がどこにあったかを教えてくれます。
例:
test.cpp には以下が含まれます。
#include "test.h"
int main()
{
#define SOMEMACRO 1
return 0;
}
test.h には以下が含まれます。
#define SOMEMACRO 2
int foo();
test.cpp をコンパイルすると、次のエラー メッセージが表示されます。
test.cpp:5:0: warning: "SOMEMACRO" redefined [enabled by default]
In file included from test.cpp:1:0:
test.h:1:0: note: this is the location of the previous definition
GCC でテストしましたが、Visual Studio でも同じことができます。