C预处理器:在#define中使用#if?

我想写一个基于它的参数的布尔值吐出代码的macros。 所以说DEF_CONST(true)应该扩展到const ,并且DEF_CONST(false)应该被扩展成什么都不是。

很明显,以下内容不起作用,因为我们不能在#defines中使用另一个预处理器:

 #define DEF_CONST(b_const) \ #if (b_const) \ const \ #endif 

任何想法如何做到这一点?

您可以使用macros令牌串联模拟条件,如下所示:

 #define DEF_CONST(b_const) DEF_CONST_##b_const #define DEF_CONST_true const #define DEF_CONST_false 

然后,

 /* OK */ DEF_CONST(true) int x; /* expands to const int x */ DEF_CONST(false) int y; /* expands to int y */ /* NOT OK */ bool bSomeBool = true; // technically not C :) DEF_CONST(bSomeBool) int z; /* error: preprocessor does not know the value of bSomeBool */ 

另外,允许将macrosparameter passing给DEF_CONST本身(正如GMan和其他人所正确指出的那样):

 #define DEF_CONST2(b_const) DEF_CONST_##b_const #define DEF_CONST(b_const) DEF_CONST2(b_const) #define DEF_CONST_true const #define DEF_CONST_false #define b true #define c false /* OK */ DEF_CONST(b) int x; /* expands to const int x */ DEF_CONST(c) int y; /* expands to int y */ DEF_CONST(true) int z; /* expands to const int z */ 

你也可以考虑更简单(虽然可能不太灵活):

 #if b_const # define DEF_CONST const #else /*b_const*/ # define DEF_CONST #endif /*b_const*/ 

把它作为一个参数化的macros是有点奇怪的。

为什么不做这样的事情:

 #ifdef USE_CONST #define MYCONST const #else #define MYCONST #endif 

那么你可以写这样的代码:

 MYCONST int x = 1; MYCONST char* foo = "bar"; 

如果使用USE_CONST编译(例如,在makefile或编译器选项中通常使用-DUSE_CONST ),那么它将使用const,否则不会。

编辑:其实我看到弗拉德在他的答案结束时覆盖了这个选项,所以+1他:)