3 回答

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

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

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