在.cpp文件中我使用宏mmData1
。我在項目中搜索,看到這個宏是在幾個文件中定義的(即有幾個.h文件,其中有#define mmData1
行)Visual Studio 2010-C++項目中的預處理器
我想知道是否有在VS10能力檢查從哪個文件預處理器採用的宏觀價值
在.cpp文件中我使用宏mmData1
。我在項目中搜索,看到這個宏是在幾個文件中定義的(即有幾個.h文件,其中有#define mmData1
行)Visual Studio 2010-C++項目中的預處理器
我想知道是否有在VS10能力檢查從哪個文件預處理器採用的宏觀價值
如果智能感知不知道那麼有沒有直接的方法。但是,有間接的方法。說你的宏的名稱是SOME_MACRO
後的#define SOME_MACRO
每個實例把#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
定義的順序。
爲最後一個+1。 – 2012-07-31 23:18:48
,最好的辦法,看看到底是什麼預處理器做的事情就是inspect its output directly.智能感知是有用的,但往往不匹配,編譯器理解的東西。
我總是使用的一個簡單的技巧是重新定義宏你想要檢查的行。當您編譯代碼時,預處理器會發出抱怨,並告訴您以前定義的位置。
例子:
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
我在GC上測試過C,但Visual Studio做同樣的事情。
我相信你可以去你使用宏的位置,並右鍵單擊宏名稱。彈出菜單有「轉到定義」和「轉到聲明」選項。其中一個應該工作,我不記得哪個。 – Blastfurnace 2012-07-30 21:23:59
@ Blastfurnace-它不起作用「符號mmData1找不到」 – Yakov 2012-07-30 21:26:30
@Blastfurnace nah,在這種情況下intellisense沒有太大的作用。你可能會得到一個定義列表,而不是它使用的定義。 – 2012-07-30 21:26:43