3 回答

TA貢獻1852條經驗 獲得超1個贊
在C ++中,最接近禁止#define關鍵字的是§17.4.3.1.1/ 2,它僅在包含標準庫頭的翻譯單元中禁止使用它:
包含頭的翻譯單元不得包含任何定義該頭中聲明或定義的名稱的宏。這樣的翻譯單元也不應為詞法上與關鍵字相同的名稱定義宏。
該段的第二句在C ++ 0x中已更改為完全禁止#define關鍵字(C ++ 0x FCD§17.6.3.3.1):
翻譯單元不得在詞義上與關鍵字相同的#define或#undef名稱。

TA貢獻1828條經驗 獲得超3個贊
從2005-10-19 C ++工作草案開始工作(因為我沒有方便使用的標準):
第16.3節定義了文法#define是#define identifier replacement-list-newline(類似對象的宏)或開頭幾種結構中的一個#define identifier lparen(函數宏)。identifier在2.10節中將定義為identifier-nondigit | identifier identifier-nondigit | identifier digit。2.11節指出,標識符的某些列表在編譯的第7階段(第2.1節)被無條件地視為關鍵字,因此,我得出結論,因此在第4階段(預處理器擴展)中并未對它們進行特殊處理。因此,似乎該標準要求預處理器允許您重新定義語言關鍵字(在2.11節中列出)。
但是,預處理器具有自己的關鍵字,即defined,以及預定義的宏列表(第16.8節)。第16.8節指出,如果您重新定義它們,則行為是不確定的,但并不禁止預處理器將它們識別為宏名。

TA貢獻1772條經驗 獲得超8個贊
根據C ++ 11 [macro.names],這是不允許的:
翻譯單元#define或#undef關鍵詞,表3中列出的標識符或7.6中描述的屬性標記的名稱或詞法上不應相同。
“表3中列出的標識符”是final和override;屬性標記是中的標識符[[fallthrough]],依此類推。
該條款也仍然是最新標準。
- 3 回答
- 0 關注
- 445 瀏覽
添加回答
舉報