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他:)