亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++預處理器#定義關鍵字。是否符合標準?

C ++預處理器#定義關鍵字。是否符合標準?

C++
人到中年有點甜 2019-11-04 09:27:03
幫助解決有關bool和1的問題的評論中正在進行的辯論:符合標準的C ++預處理程序可以允許使用它#define來重新定義語言關鍵字嗎?如果是這樣,那么符合標準的C ++預處理器必須允許嗎?如果C ++程序重新定義了語言關鍵字,那么該程序本身是否符合標準?
查看完整描述

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名稱。



查看完整回答
反對 回復 2019-11-04
?
子衿沉夜

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節指出,如果您重新定義它們,則行為是不確定的,但并不禁止預處理器將它們識別為宏名。


查看完整回答
反對 回復 2019-11-04
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

根據C ++ 11 [macro.names],這是不允許的:


翻譯單元#define或#undef關鍵詞,表3中列出的標識符或7.6中描述的屬性標記的名稱或詞法上不應相同。


“表3中列出的標識符”是final和override;屬性標記是中的標識符[[fallthrough]],依此類推。


該條款也仍然是最新標準。


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 445 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號