[英]According to the C standard, may macros with arguments collide with identifiers?
我認為用一個例子可以更好地說明。 使用這樣的結構:
typedef struct {
int a;
char b;
} Foo;
定義一個宏:
#define Foo(A, B) (Foo){ A, B }
然后可以像這樣使用:
Foo foo;
foo = Foo(1, 'c');
我一直在使用這種模式,對我而言,它是一種非常優雅的初始化結構的方法。 它適用於GCC和Clang(以及我認為的TCC),但在一些鮮為人知的C編譯器(如Plan 9的C編譯器)中卻沒有。
C標准對該主題有何規定?
摘錄自C11標准的§6.10.3.10:
類似函數的宏名稱的每個后續實例后跟一個 (作為下一個預處理標記引入了預處理標記的序列,該標記由定義中的替換列表(宏的調用)替換)。
所以,不,你不應該擔心。 只有當宏名稱后跟一個左括號時,才會替換類似函數的宏(。
預處理器進行文本替換,它對C語言一無所知。 因此,它不關心C標識符。
所以,不,宏不能與標識符沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.