簡體   English   中英

在 C 中的宏中替換宏

[英]Substituting macros within macros in C

我正在嘗試使代碼段可重用。 我下面的評論片段沒有做我想要的:

#define NAME ABC 
#define LOG_SIZE NAME##_LEN 

我希望LOG_SIZE解析為ABC_LEN 我試過玩弄#,但一直無法讓它發揮作用。 LOG_SIZE用於整個代碼,所以我不想將宏更改為:

#define LOG_SIZE(name) name##_LEN

有沒有辦法做到這一點?

問題在於,如果宏參數被字符串化或連接到另一個標記,則它們不會自動展開。

C99 6.10.3.1/1:

在確定調用類函數宏的參數后,將進行參數替換。 替換列表中的參數,除非前面有 # 或 ## 預處理標記或后跟 ## 預處理標記(見下文),否則在其中包含的所有宏都已展開后由相應的參數替換。 在被替換之前,每個參數的預處理標記被完全宏替換,就好像它們形成了預處理文件的其余部分一樣; 沒有其他預處理令牌可用。

您可以通過在傳遞NAME宏和將其與_LEN連接的宏之間添加另一個宏來解決此_LEN

#define NAME ABC
#define AFTERX(x) x##_LEN
#define XAFTERX(x) AFTERX(x)
#define LOG_SIZE XAFTERX(NAME)

LOG_SIZE
//evaluates to ABC_LEN

如果您好奇,gcc 手冊會在第 3.10.6 節:參數預掃描中更詳細地介紹

暫無
暫無

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

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