2013-08-30 160 views
0

我的代碼如下:爲什麼宏在這種情況下不起作用?

funcA() { 
    #define strdup(a) NULL 
    funcB(); 
} 

雖然funcB()在另一個文件。我發現marco strdup(a)不起作用。我可以如何使它工作?

+0

定義與標準庫名稱相同名稱的宏是未定義的行爲。 –

+0

@KerrekSB:爲什麼? – alk

+0

我在做單元測試。 – user1952216

回答

4

我假設funcB使用strdup,否則你的問題沒有意義。

宏只與預處理器相關,不會傳播到不同的編譯單元。如果funcB位於不同的編譯單元中,那麼該宏也需要在那裏定義,這通常通過將包含該宏的頭部包括到需要它的所有編譯單元中來實現。

1

它不起作用,因爲包含funcB的源文件不知道您的宏。

宏在預處理過程中展開,不會傳播到不同的翻譯單元。也就是說,解決這個問題的常用方法是將宏定義放在頭文件中。包含每個需要宏定義的源文件。

從C標準

另外:

6.10.3.5宏德音響nitions

宏德音響nition持續(獨立塊結構的),直到對應#undef 指令遇到或範圍(如果沒有遇到)直到預處理結束 翻譯單元。宏定義在翻譯階段4後沒有意義。

因此它不需要計算函數範圍。

相關問題