簡體   English   中英

類似函數的宏和變量

[英]function-like macros and variables

由於一些不可理解的原因,在我的代碼中我有類似的東西:

#define pippo(x) printf("%d",x)
...
... many lines down in the code
...
int pippo = 0;

相同的標識符pippo已用於類似函數的宏和變量名,除了這可能會在可憐的維護者中引起混淆。 我想知道這是否符合標准。

C99 和 C11(在 6.10.3.)都說:

10 [...] 類函數宏名稱的每個后續實例后跟一個 ( 作為下一個預處理標記引入預處理標記序列,該序列被定義中的替換列表替換 [...]

他們沒有說明如果類似函數的宏名稱后面沒有跟一個 '(' 會發生什么,我擔心某些編譯器可能會認為這是一個錯誤(或者可能只是發出警告)。

我是不是太擔心了?

不會替換后面沒有(的類函數宏名稱的實例。

因此使用名稱並不違反 C 標准中的約束。 該標准甚至給出了使用此行為的示例。 C 2018 7.1.4 1,討論標准庫函數及其作為類函數宏的潛在實現(除了作為函數的定義),說:

…任何 function 的宏定義都可以通過將 function 的名稱括在括號中來在本地抑制,因為該名稱后面沒有左括號,表示宏 function 名稱的擴展。 出於同樣的語法原因,允許使用庫的地址 function 即使它也被定義為宏......

編譯器可能會發出警告(盡管當宏名稱是庫 function 時它可能希望抑制此警告,正如上面 C 標准所建議的那樣),但 GCC 9.2 和 Clang 11.0.0 都不會這樣做,即使啟用了所有警告.

5.1.1.2,第 4 點,如果您願意,指定如何“調用”預處理器:

執行預處理指令,展開宏調用,並執行 _Pragma 一元運算符表達式。 [...] 然后刪除所有預處理指令。

因此,這意味着預處理器未觸及的任何內容都將被保留,包括任何未跟隨(pippo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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