预处理/预编译 - 用常量替换变量

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=5b=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 ,除非我是那个漏掉的东西。

以上是关于预处理/预编译 - 用常量替换变量的主要内容,如果未能解决你的问题,请参考以下文章

const、define、static、extern

C语言中程序的编译(预处理操作)+链接详解(详细介绍程序预编译过程)

怎么把C语言中定义的符号变量替换为对应的常量?求代码

OC中extern、static、const和宏定义

宏常量,宏替换,const常量

如何利用宏定义