如何在C预处理器令牌中转义下划线?
时间:2020-03-06 14:48:29 来源:igfitidea点击:
以下代码段应采用PROJECT的值(在Makefile中定义)
并创建一个包含文件名。例如,如果PROJECT = classifier,则最后应为PROJECTINCSTR生成classifier_ir.h
我发现只要我不尝试在后缀中使用下划线,该代码就可以正常工作。但是,下划线的使用不是可选的,我们的代码库在所有地方都使用下划线。我可以解决此问题,因为PROJECT的值数量有限,但我想知道如何使用下划线使以下代码段实际起作用。可以逃脱吗?
#define PROJECT classifier #define QMAKESTR(x) #x #define MAKESTR(x) QMAKESTR(x) #define MAKEINC(x) x ## _ir.h #define PROJECTINC MAKEINC(PROJECT) #define PROJECTINCSTR MAKESTR(PROJECTINC) #include PROJECTINCSTR
编辑:编译器应尝试包含classifier_ir.h,而不是PROJECT_ir.h。
解决方案
该准系统示例适用于gcc(v4.1.2),并尝试包含" PROJECT_ir.h"
#define QMAKESTR(x) #x #define MAKESTR(x) QMAKESTR(x) #define SMASH(x,y) x##y #define MAKEINC(x) SMASH(x,_ir.h) #define PROJECTINC MAKEINC(PROJECT) #define PROJECTINCSTR MAKESTR(PROJECTINC)
这对我有用:
#define QMAKESTR(x) #x #define MAKESTR(x) QMAKESTR(x) #define MAKEINC(x) x ## _ir.h #define PROJECTINC(x) MAKEINC(x) #define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT)) #include PROJECTINCSTR