我正在使用 BOOST_PP 在预处理器中进行预编译计算。我专注于代码大小对我来说极其重要的应用程序。(所以请不要说编译器应该或通常这样做,我需要控制在编译时执行什么以及生成什么代码)。但是,我希望能够对整数常量和变量使用相同名称的宏/函数。作为一个简单的例子,我可以有
#define TWICE(n) BOOST_PP_MUL(n,2)
//.....
// somewhere else in code
int a = TWICE(5);
这做我想要的,评估
int a = 10;
在编译期间。
但是,我也希望它用于
int b = 5;
int a = TWICE(b);
这应该被预处理为
int b = 5;
int a = 5 * 2;
当然,我可以通过使用传统的宏来做到这一点,比如
#define TWICE(n) n * 2
但是它并没有做我想让它为整数常量做的事情(在编译时评估它们)。
所以,我的问题是,是否有一个技巧来检查参数是文字还是变量,然后使用不同的定义。即,像这样:
#define TWICE(n) BOOST_PP_IF( _IS_CONSTANT(n), \
BOOST_PP_MUL(n,2), \
n * 2 )
编辑:所以我真正追求的是某种方法来检查某些东西在编译时是否可用,因此是 BOOST_PP_ 函数的一个很好的论据。我意识到这与大多数人对预处理器和一般编程建议的期望不同。但是没有错误的编程方式,所以如果你不同意它的理念,请不要讨厌这个问题。BOOST_PP 库的存在是有原因的,这个问题也是如此。不过,这可能是不可能的。