如何在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