gpt4 book ai didi

我可以使用标记粘贴来处理编译时命名吗?

转载 作者:行者123 更新时间:2023-11-30 16:09:55 25 4
gpt4 key购买 nike

假设我有一个文件,我可以#include定义如下内容:

#define GROUP_NUMBER_FOO 42
#define GROUP_NUMBER_BAR 37

我想#define一个宏,如果像这样调用

GROUPID(FOO)(x);
GROUPID(BAR)(x);

转换为

GROUP42_ELEMENT_FOO(x);
GROUP37_ELEMENT_BAR(x);

我希望这可以通过标记粘贴来完成(如 Nested ## operator in C PreprocessorHow to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"? ),但我似乎不知道如何做到这一点。

类似

#define EXTRACT_GROUP(name) GROUP_NUMBER_##name
#define GROUPID(name) GROUP##EXTRACT_GROUP(name)##_ELEMENT_##name

但是如果我尝试使用GROUPID(FOO),则会收到错误:

 error: pasting ")" and "_ELEMENT_" does not give a valid preprocessing token

(在有人说“XY 问题!”之前,我正在尝试以更明智的方式适应一些现有的尴尬 API。)

最佳答案

啊哈,我跌跌撞撞地穿过了它;看来我需要添加额外的间接级别:

#define GROUP_NUMBER_FOO 42
#define GROUP_NUMBER_BAR 37

#define CONCAT(x,y) x##y
#define EVALCAT(x,y) CONCAT(x,y)
#define CONCAT4(x,y,z,w) x##y##z##w
#define EVALCAT4(x,y,z,w) CONCAT4(x,y,z,w)
#define EXTRACT_GROUP(name) CONCAT(GROUP_NUMBER_,name)
#define GROUPID(name) EVALCAT4(GROUP,EXTRACT_GROUP(name),_ELEMENT_,name)

GROUPID(FOO)
GROUPID(BAR)

将其转换为所需的内容

GROUP42_ELEMENT_FOO
GROUP37_ELEMENT_BAR

关于我可以使用标记粘贴来处理编译时命名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58987555/

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