如何在C预处理程序令牌中转义下划线?

时间:2008-09-26 20:47:08

标签: c c-preprocessor

以下代码段应该采用PROJECT的值(在Makefile中定义) 并创建一个包含文件名。例如,如果PROJECT =分类器,那么最后它应该为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。

3 个答案:

答案 0 :(得分:7)

#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)

答案 1 :(得分:1)

这对我有用:

#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

答案 2 :(得分:0)

该准系统示例适用于gcc(v4.1.2)并尝试包含“PROJECT_ir.h”