2012-11-14 83 views
5

我知道這個代碼是有效的既在C和C++:宏重定義和C++

#define FOO 0 
#define FOO 0 

ISO/IEC 14882:2011

16.3宏替換[cpp.replace ]

2當前定義爲類似對象的宏的標識符可能是 由另一個#define預處理指令重新定義,前提是 秒ond定義是一個類似於對象的宏定義,兩個替換列表是相同的,否則該程序是格式不正確的。 同樣,當前被定義爲功能樣宏的標識符可以由另一個#定義預處理指令重新定義,只要第二個定義是具有相同數量和參數拼寫的函數式宏定義,並且兩個替換名單 是相同的,否則該程序是格式不正確的。

但是這個代碼呢?

#define FOO 0 
#define FOO FOO 

替換列表在預處理開始時(僅在發生第一次替換時)不相同。

+0

這對我來說似乎是一個不好的方法。未來的開發者可能會導致混淆和可能的錯誤。 –

+1

@Jonathan Wood我不想在真實代碼中使用它,只是有趣的時刻 – FrozenHeart

回答

6

這不允許在C或C++中使用。替換列表必須完全相同。你所說的(第一遍之後)是處理替換列表的結果,而不是替換列表本身。由於替換列表本身並不相同,因此代碼不被允許。


或者至少其結果將是什麼,如果預處理器的工作恰好是從實際怎麼做不同的一種特殊方式。

+1

換句話說,除了空格之外,右側必須是相同的令牌序列。 –