2010-11-01 102 views
3


我有一個關於使用#undef重新定義宏的問題。
我有一個文件global.h其中包含一些#define-d宏。在使用這些宏的代碼中,我發現宏保存的值不夠通用。我想重新定義宏以使它們更通用。我寫了下面的代碼片段來做到這一點:範圍#undef C++

std::cout << endl << "Enter pitch threshold:" << endl; 
std::cin >> pitchT; 
#ifdef PitchThreshold 
    #undef PitchThreshold 
    #define PitchThreshold pitchT 
    #endif 

我的問題是:
是否使用和#undef以這種方式確保所有源文件宏的重新定義,或者是本地的函數,其中上面的代碼行被寫入? #undef和#define運算符的範圍是什麼?
我可以做些什麼(除了改變它們所在的文件中的宏#define-d本身),以確保宏定義在所有源文件中被更改?
謝謝,
斯利拉姆

回答

9

#ifdef是一個預處理指令,這意味着你的源代碼被編譯之前,將被應用。這意味着只有源代碼'下面'會受到影響。如果您通過預處理器運行源代碼,您將能夠看到結果。這將使您對預處理器的工作有更多的瞭解。

+0

但是#undef操作符與它重新定義的值有什麼關係?例如,在上面的代碼片段中,pitchT是一個int,它對於重定義發生的函數是本地的。當pitchT超出範圍時,它是否會影響#define語句? – Sriram 2010-11-01 10:20:27

+3

您不能在運行時更改宏的值。預處理器只進行文本替換,因此下次在您的代碼中使用「PitchThreshold」時,它將被替換爲「pitchT」(變量名稱,而不是其值)。 – 2010-11-01 11:11:52

+0

那是我正在尋找的答案!謝謝larsmans!我認爲#define會用它的價值取代pitchT。 – Sriram 2010-11-01 11:41:51

1

#undef操作符的作用域是被調用後的整個文件。這包括所有包含它的文件(因爲預處理器只是將文件鏈接在一起。)因爲它是預處理器的一部分,所以它沒有像範圍那樣的奇怪事情。

+0

但#undef操作符與它重新定義的值有什麼關係?例如,在上面的代碼片段中,pitchT是一個int,它對於重定義發生的函數是本地的。當pitchT超出範圍時,它是否會影響#define語句? – Sriram 2010-11-01 10:21:14

+0

所有'#define A B'操作符都會將A的所有實例替換爲B.您可以在'(true){}'定義INFLOOP,並且預處理器會很樂意替換它。預處理器只是對文本執行操作,對C語言完全不可知。在您發佈的代碼的上下文中,您的問題沒有意義,因爲沒有任何文本正在被替換。 「PitchThreshold」沒有出現在你的C代碼中。 – OmnipotentEntity 2010-11-01 10:26:50

+0

PitchThreshold是名爲global.h的文件中定義的宏的「名稱」,但在名爲sentence.C的文件中重新定義。如果pitchThreshold沒有出現,那是因爲我沒有發佈整個代碼。 – Sriram 2010-11-01 10:42:11