我正在尝试包含一个由预处理器宏构造的文件,但由于令牌的规则,它似乎遇到了墙。我用这里的答案作为参考:Concatenate string in C #include filename,但我的情况不同,因为在我用来构造include的定义中有小数点。这是我目前无法通过预处理器阶段的内容:
主要c:

#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;
}

其他1.1.0.h:
#define SUCCESS

如果我使用#define VERSION 1_1_0并相应地重命名了头文件,它将工作(但对我的使用不可行,因为我无法控制实际项目使用的头文件的名称),但1.1.0不是有效的预处理器标记。
编辑:
在对文档进行深入研究之后,我发现1.1.0是一个有效的preprocessing number;它是other_1.1.0的结果连接,这是无效的无论如何,无法构建include的问题仍然存在。

最佳答案

一旦停止考虑令牌连接,就很容易了。Stringification适用于任何令牌序列,因此无需将其参数强制为单个令牌您确实需要一个额外的间接寻址,以便展开参数,但这是正常的。
唯一的诀窍是不使用空格来编写序列,这就是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/

10-11 21:58