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

Preprocessing/precompiling - replace variable by constant

本文关键字:常量 替换 变量 编译 预处理      更新时间:2023-10-16

我正在开发一个函数,它采用了一系列众所周知的参数,但我不想为每种情况编写许多不同的函数。有没有一种方法可以定义函数的"模式",并使预编译器基于该模式生成函数?

示例。我有以下功能:

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};
}

这是我的问题。是否有任何预处理库、机制或其他可以自动执行的功能?

出于性能考虑,我只想从代码中删除变量。如果用常量而不是变量,这些函数会复杂得多,效果也会更好。因为这些变量只使用一些众所周知的值,所以我想把它们改为常量而非变量。

对于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;
}

如果没有任何特殊工具,您可以做到这一点:

#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预处理器可以帮助您使其更加紧凑。看一下BOOST_PP_LOCAL_ITERATE