2008-09-26 34 views
1

以下代码片段应该取值为PROJECT(在Makefile中定义) 并创建一个包含文件名。例如,如果PROJECT = classifier,那么它应该在最后为PROJECTINCSTR生成classifier_ir.h如何转义C预处理器令牌中的下划线?

我发现只要我不想在后缀中使用下划线,这段代码就会工作。然而,下划线的使用不是可选的 - 我们的代码库在任何地方都使用它们。我可以解决这个问题,因为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。

+0

我希望你们有一个很好的理由因为这对于后来出现的任何人来说都是完全不明显的。你使用的是Makefile中的一个变量,执行一些疯狂的宏魔法,这包括一个由宏命名的文件。有人会不知道发生了什么。 – 2008-09-26 21:07:44

+0

我们正在手动编辑这个包含在使用此代码的每个项目中,或自动做正确的事情之间取得平衡。原来这不是必需的,但我仍然有兴趣了解为什么代码不起作用。 – amo 2008-09-26 21:17:57

回答

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

这准系统例如与海湾合作委员会(V4.1.2)的作品,并试图包括“PROJECT_ir.h”

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