gpt4 book ai didi

c - 从预处理器宏中包含

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:35 24 4
gpt4 key购买 nike

我正在尝试包含一个由预处理器宏构建的文件,但似乎由于有关 token 的规则而撞墙。我用这里的答案作为引用:Concatenate string in C #include filename ,但我的情况有所不同,因为我用来构造包含的定义中有小数点。这是我目前无法通过预处理器阶段的内容:主程序:

#include <stdio.h>
#include <stdlib.h>

#define VERSION 1.1.0
#define STRINGIFY(arg) #arg
#define INCLUDE_HELPER(arg) STRINGIFY(other_ ##arg.h)
#define INCLUDE_THIS(arg) INCLUDE_HELPER(arg)

#include INCLUDE_THIS(VERSION)

int main(int argc, char **argv) {

printf(INCLUDE_THIS(VERSION));
fflush(stdout);
#if defined (SUCCESS)
printf("\nSUCCESS!\n");
#endif
return EXIT_SUCCESS;
}

other_1.1.0.h:

#define SUCCESS

如果我使用 #define VERSION 1_1_0 并相应地重命名 header 它会起作用(但对我的使用不可行,因为我无法控制实际项目使用的 header 文件的名称) , 但 1.1.0 不是有效的预处理器 token 。

编辑:仔细阅读文档后,我发现 1.1.0 是一个有效的 preprocessing number;它是无效的 other_1.1.0 的串联结果。无论如何,无法构建 include 的问题仍然存在。

最佳答案

一旦您不再考虑标记串联,这就很容易了。字符串化适用于任何标记序列,因此无需强制其参数成为单个标记。您确实需要一个额外的间接寻址以便扩展参数,但这是正常的。

唯一的技巧是写出没有空格的序列,这就是 ID 的用途:

#define STRINGIFY(arg) STRINGIFY_(arg)
#define STRINGIFY_(arg) #arg
#define ID(x) x

#define VERSION 1.1.0
#include STRINGIFY(ID(other_)VERSION.h)

参见 https://stackoverflow.com/a/32077478/1566221以获得更长的解释。

关于c - 从预处理器宏中包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49497268/

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