2014-06-12 46 views
2

如果#define在使用時沒有價值,像用C語言中使用#define沒有價值

#define COMMAND_SPI() 

它取默認值0?

+2

究竟是什麼阻止了你自己運行預處理器,看看會發生什麼? –

+0

請注意,您已經定義了類似函數的宏,這意味着除非後面跟着一個帶括號的參數列表,否則不會展開COMMAND_SPI。 –

+0

@KerrekSB @KerrekSB在一個測試用例中,一個系統的行爲並不能保證所有系統的行爲相同(或者甚至當在同一系統上重新運行時,相同的代碼的行爲相同) –

回答

5

不,它評估爲無。從字面上看,符號被替換爲無。

但是,一旦您有#define FOO,預處理器條件#ifdef FOO現在將成立。

還請注意,在gcc和其他可能的編譯器中,如果您在命令行上使用-DFOO定義宏,則默認情況下該值的計算結果爲1


由於OP更新了他的問題以引用函數式的宏,我們來考慮一個小例子。

#define FOO 
#define BAR() 


FOO 
BAR 
BAR() 

這不是一個有效的C程序,但預處理器並不關心。 如果我編譯這個gcc -E Input.c,我得到一個空白,其次是BAR其次是空白。這是因爲第一個和第三個表達式評估爲虛無,中間表達式沒有擴展,因爲後面沒有()

+0

最後一段是編譯器特有的; gcc的行爲方式,但它不是由語言指定。對於gcc和類似的編譯器,你可以通過在命令行上傳遞'-DFOO ='來完成'#define FOO'的等價操作。 –

+0

@凱特湯普森,謝謝你的告誡。我會把它折成答案。 – merlin2011

+0

請注意,POSIX要求['c99'](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html)提供'-D'行爲:'-D name [= value]'_Define name就像用C語言的'#define'指令一樣。如果未給出'= value',則應使用值1。 '-D'選項的優先級低於'-U'選項。也就是說,如果在'-U'和'-D'選項中都使用名稱,則不管選項的順序如何,名稱都應該是不確定的。編譯器可以提供其他實現定義的名稱。實現應支持至少2048字節的'-D'定義和256個名稱._ –