我想根据编译时常数有条件地生成一个变量名。可能还有其他方法可以做到这一点,但我想看看使用预处理器是否可行。
#define FUNC(X) ((X > 10) ? foo : bar)
#define CONCAT1(x,y) x##y
#define CONCAT(x,y) CONCAT1(x,y)
int main() {
// Does not compile and generate "int x_bar;"
int CONCAT(x_, FUNC(4));
}
回想一下,宏可以直接进行令牌替换。所以这:
CONCAT(x_, FUNC(4))
将展开为:
x_((4 > 10) ? foo : bar)
对于令牌连接无效。相反,您应该将条件放在#if
中,并根据其结果定义FUNC
:
#define X 4
#if (X > 10)
#define FUNC foo
#else
#define FUNC bar
#endif