我的代碼如下:爲什麼宏在這種情況下不起作用?
funcA() {
#define strdup(a) NULL
funcB();
}
雖然funcB()在另一個文件。我發現marco strdup(a)
不起作用。我可以如何使它工作?
我的代碼如下:爲什麼宏在這種情況下不起作用?
funcA() {
#define strdup(a) NULL
funcB();
}
雖然funcB()在另一個文件。我發現marco strdup(a)
不起作用。我可以如何使它工作?
我假設funcB
使用strdup
,否則你的問題沒有意義。
宏只與預處理器相關,不會傳播到不同的編譯單元。如果funcB
位於不同的編譯單元中,那麼該宏也需要在那裏定義,這通常通過將包含該宏的頭部包括到需要它的所有編譯單元中來實現。
它不起作用,因爲包含funcB
的源文件不知道您的宏。
宏在預處理過程中展開,不會傳播到不同的翻譯單元。也就是說,解決這個問題的常用方法是將宏定義放在頭文件中。包含每個需要宏定義的源文件。
從C標準另外:
6.10.3.5宏德音響nitions
宏德音響nition持續(獨立塊結構的),直到對應
#undef
指令遇到或範圍(如果沒有遇到)直到預處理結束 翻譯單元。宏定義在翻譯階段4後沒有意義。
因此它不需要計算函數範圍。
定義與標準庫名稱相同名稱的宏是未定義的行爲。 –
@KerrekSB:爲什麼? – alk
我在做單元測試。 – user1952216