簡體   English   中英

根據C標准,帶參數的宏可能會與標識符沖突嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM