gpt4 book ai didi

C 宏 : concatenate symbols conditionally

转载 作者:太空狗 更新时间:2023-10-29 16:08:05 25 4
gpt4 key购买 nike

我有

#define A_T 1
#define B_T 2
int x_a = 1, x_b =2;

我如何定义一个宏,它可以将后缀 _a 和 _b 连接到 var 名称?

for example, something like this
#define A_T_SUF _a
#define B_t_SUF _b
#define SUFFIX(t) t ## _SUF
#define VAR_SUF(var, t) var ## SUFFIX(t)
.....
VAR_SUF(x, A_T) ---> be replaced to x_a

这可能吗?

最佳答案

您需要在 VAR_SUF 宏中进行额外的间接寻址,以强制它在连接标记之前评估被调用的宏,而不是先连接:

#define A_T_SUF _a
#define B_t_SUF _b
#define SUFFIX(t) t ## _SUF
#define CAT(a, b) a ## b
#define XCAT(a, b) CAT(a, b)
#define VAR_SUF(var, t) XCAT(var, SUFFIX(t))
.....
VAR_SUF(x, A_T) ---> be replaced to x_a

如果没有额外的间接,VAR_SUF(x, A_T) 将扩展为 xSUFFIX(A_T)(首先连接,然后寻找更多宏)。使用额外的 CAT/XCAT 间接寻址,它将首先扩展 SUFFIX(A_T),然后连接。

XCATEXPAND_AND_CONCATENATE 的缩写,而 CAT 只是 CONCATENATE(没有扩展。)

编辑

如果 A_T 也是一个宏(例如,#define A_T 1),那么它将首先被替换。您可以通过删除 SUFFIX 宏中 ## 的间接访问来避免这种情况:

#define A_T_SUF _a
#define B_t_SUF _b
#define CAT(a, b) a ## b
#define XCAT(a, b) CAT(a, b)
#define VAR_SUF(var, t) XCAT(var, t##_SUF)
.....
VAR_SUF(x, A_T) ---> be replaced to x_a

这将导致首先发生连接,然后扩展宏,然后发生其他连接

如果 x 也是一个宏,那么您就会遇到问题,因为在连接它们之前没有很好的方法来扩展一个标记而不是另一个标记。

关于C 宏 : concatenate symbols conditionally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16532504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com