预处理/预编译 - 用常量替换变量
Posted
技术标签:
【中文标题】预处理/预编译 - 用常量替换变量【英文标题】:Preprocessing/precompiling - replace variable by constant 【发布时间】:2014-04-20 11:12:24 【问题描述】:我正在开发一个函数,该函数采用众所周知的参数范围,但我不想为每种情况编写许多不同的函数。有没有办法定义一个函数的“模式”并让预编译器根据这个模式生成函数?
示例。我有以下功能:
int addition_in_range_of_10 (int a, int b) return a+b;
我想生成以下函数:
int addition_in_range_of_10_1_1 ()
return 2;
int addition_in_range_of_10_1_2 ()
return 3;
int addition_in_range_of_10_1_3 ()
return 4;
...
int addition_in_range_of_10_10_10 ()
return 20;
我想使用函数指针运行这些函数:
int (*funp)();
if(...)
funp = addition_in_range_of_10_1_3;
funp();
现在我编写了自己的应用程序,该应用程序从上面列举的模板函数执行,但将代码复制到我的应用程序然后生成 cpp 文件然后编译是不舒服的。我想让它自动化。
//A=1,2,3,4,5,6,7,8,9,10;B=1,2,3,4,5,6,7,8,9,10
int addition_in_range_of_10_A_B ()
return A+B;
这是我的问题。是否有任何预处理库、机制或可以自动执行的东西?
出于性能考虑,我只想从代码中删除变量。这些函数要复杂得多,如果有常量而不是变量,效果会更好,而且因为这些变量只使用一些众所周知的值,所以我想将它们更改为常量而不是变量。
【问题讨论】:
您似乎要创建一个查找表。 没有冒犯,但你不相信你的编译器能正确乘法吗? :) 我认为这是一个人为的例子,只是为了说明您正在寻找的机制。问题是,它如此 做作,很难在这里提出任何明智的建议。您要解决的真正问题是什么? @nosbor:不过,这些都是等价的问题。如果你在运行时有a=5
和b=7
,你不能在没有查找表机制的情况下调用expensiveFunction_5_7()
。
@nosbor 函数指针将比 const 查找数组或 constexpr 函数慢很多。
【参考方案1】:
对于 C++
#include <iostream>
template <int A, int B>
int addition_in_range_of_10(void)
return A + B;
int main()
int (*funp)();
if(1)
funp = addition_in_range_of_10<1,3>;
std::cout << funp() << std::endl;
return 0;
【讨论】:
【参考方案2】:无需任何特殊工具即可:
#define MYADD(A,B) \
int addition_in_range_of_10_##A##_##B () \
return A+B; \
#define MYADD2(A) \
MYADD(A,1) \
MYADD(A,2) \
...
MYADD(A,10)
MYADD2(1)
MYADD2(2)
...
MYADD2(10)
但是boost preprocessor 可以帮助您使其更紧凑。看看BOOST_PP_LOCAL_ITERATE
。
【讨论】:
这就是我想要的。谢谢! 我认为你在MYADD2
后面漏掉了一个 #define
,除非我是那个漏掉的东西。以上是关于预处理/预编译 - 用常量替换变量的主要内容,如果未能解决你的问题,请参考以下文章