2012-07-30 34 views
6

在.cpp文件中我使用宏mmData1。我在項目中搜索,看到這個宏是在幾個文件中定義的(即有幾個.h文件,其中有#define mmData1行)Visual Studio 2010-C++項目中的預處理器

我想知道是否有在VS10能力檢查從哪個文件預處理器採用的宏觀價值

+0

我相信你可以去你使用宏的位置,並右鍵單擊宏名稱。彈出菜單有「轉到定義」和「轉到聲明」選項。其中一個應該工作,我不記得哪個。 – Blastfurnace 2012-07-30 21:23:59

+0

@ Blastfurnace-它不起作用「符號mmData1找不到」 – Yakov 2012-07-30 21:26:30

+0

@Blastfurnace nah,在這種情況下intellisense沒有太大的作用。你可能會得到一個定義列表,而不是它使用的定義。 – 2012-07-30 21:26:43

回答

4

如果智能感知不知道那麼有沒有直接的方法。但是,有間接的方法。說你的宏的名稱是SOME_MACRO

  1. 後的#define SOME_MACRO每個實例把#error Defined here,然後右鍵單擊源文件,並選擇Compile。如果編譯器返回錯誤,請刪除引發它並重新編譯的指令。此錯誤的最後一個實例將尾隨源中可見的定義。

  2. 使每個指令定義SOME_MACRO把它定義爲別的東西,然後,在源文件中,添加這些線都包括後:

    #define STRINGIZE(x) STRINGIZE2(x) 
    #define STRINGIZE2(x) #x 
    #pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO)) 
    

    編譯源文件;你應該看到構建日誌中的值。

  3. 少侵入性的方式:把那些行,每行#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定義的順序。

+0

爲最後一個+1。 – 2012-07-31 23:18:48

1

,最好的辦法,看看到底是什麼預處理器做的事情就是inspect its output directly.智能感知是有用的,但往往不匹配,編譯器理解的東西。

0

我總是使用的一個簡單的技巧是重新定義宏你想要檢查的行。當您編譯代碼時,預處理器會發出抱怨,並告訴您以前定義的位置。

例子:

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做同樣的事情。

相關問題