[英]C++ preprocessor #define-ing a keyword. Is it standards conforming?
在這個關於bool和1的問題的評論中幫助解決正在進行的辯論:
符合標准的C ++預處理器是否允許使用#define
重新定義語言關鍵字? 如果是這樣,符合標准的C ++預處理器是否允許這樣做?
如果C ++程序重新定義了一個語言關鍵字,那么該程序本身是否符合標准?
在C ++中,最接近#define
ing關鍵字的是§17.4.3.1.1/ 2,它只允許在包含標准庫頭的翻譯單元中使用它:
包含標頭的轉換單元不應包含定義在該標頭中聲明或定義的名稱的任何宏。 這樣的翻譯單元也不應該為與關鍵字詞匯相同的名稱定義宏。
該段的第二句已在C ++ 0x中更改為徹底禁止 #define
一個關鍵字(C ++ 0xFCD§17.6.3.3.1):
翻譯單元不得#define或#undef名稱與關鍵字詞匯相同。
編輯:正如Ken Bloom在回答他的回答中指出的那樣,規則在C ++ 0x中沒有改變; 文本剛剛被重新排列,以迷惑像我這樣的人。 :-)
從2005-10-19 C ++工作草案開始工作 (因為我沒有標准的方便):
第16.3節將#define
的語法定義為#define
#define identifier replacement-list-newline
(類似對象的宏)或以#define identifier lparen
(類似函數的宏)開頭的幾種結構之一。 identifier
s在2.10節中定義為identifier-nondigit | identifier identifier-nondigit | identifier digit
identifier-nondigit | identifier identifier-nondigit | identifier digit
identifier-nondigit | identifier identifier-nondigit | identifier digit
。 第2.11節表明在編譯的第7階段(第2.1節)中無條件地將某個標識符列表視為關鍵字,並且我得出結論,因此在第4階段(即預處理器擴展)中不對它們進行特殊處理。 因此,標准似乎要求預處理器允許您重新定義語言關鍵字(在第2.11節中列出) 。
但是,預處理器有一個自己的關鍵字,即已defined
的關鍵字,以及一個預定義宏列表(第16.8節)。 第16.8節聲明如果重新定義這些行為,則行為是未定義的,但不禁止預處理器將這些行為識別為宏名稱。
根據C ++ 11 [macro.names],這是不允許的:
翻譯單元不得
#define
或#undef
名稱與關鍵字詞匯相同,與表3中列出的標識符或7.6中描述的屬性標記相同。
表3中列出的“標識符”是final
並且override
; 並且屬性標記是[[fallthrough]]
中的標識符,依此類推。
該條款仍然是最新的標准。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.