【发布时间】:2010-10-07 18:05:05
【问题描述】:
我正在使用 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 库的存在是有原因的,这个问题也是如此。不过,这可能是不可能的。
【问题讨论】:
-
你可以通过使用模板而不是预处理器来获得这个
-
@aaa 模板可以选择常量吗?如果可以的话,我很乐意(即使模板需要 c++ 编译)。但我不知道如何编写这样的模板。
-
c和boost在一起?只是问......它可以完全没问题 -
@pmg 看来 boost.pp 与纯 c 兼容。
标签: c boost-preprocessor