為了評估#if條件,我的預處理器似乎假定未定義的常量為0 ??梢砸揽克鼏幔蛘呶炊x的常量會產生未定義的行為?
3 回答

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
是的,可以依靠它。C99標準在§6.10.1?3中進行了規定:
由于宏擴展和已定義的一元運算符而執行所有替換后,所有剩余的標識符都將替換為pp-number 0
編輯
抱歉,我認為這是一個C問題。沒什么大不了的,C ++標準(第16.1節?4)中的等效部分指出:
由于宏擴展和已定義的一元運算符而執行了所有替換后,除true和之外的所有其余標識符和關鍵字false將替換為pp-number0
唯一的區別是不同處理的true和false,其中用C不需特殊處理,而在C ++中,他們有一個特殊的意義,即使在預處理階段。

HUWWW
TA貢獻1874條經驗 獲得超12個贊
0
在對表達式求值之前,會將未定義為宏的標識符轉換為。
標識符true
是例外,它將轉換為1
。這是特定于C ++預處理程序的;在C語言中,這不會發生,您需要包括<stdbool.h>
使用true
這種方式,在這種情況下,它將被定義為宏,并且不需要任何特殊處理。

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
只是好奇:編譯器為什么要這么做?為什么在表達式未定義并且編譯器仍然知道這一點時,編譯器為什么不能拋出錯誤消息?這不會導致軟件中不必要的錯誤嗎?我真的很困惑,為什么較新的編譯器不注意這一點。僅僅是因為必須保持向后兼容性嗎?
- 3 回答
- 0 關注
- 879 瀏覽
添加回答
舉報
0/150
提交
取消