用编译运算符##创造被调函数名,调用函数。

用编译运算符##创造被调函数名,调用函数。

我希望用变量代替被调函数test3()中的3.

我的解答思路和尝试过的方法
#include <iostream>
using namespace std;

//用字面值3可正常工作。
#define FUN(n) test##n();   //宏定义

int FUN(3)   //函数声明语句,宏展开即:test3();

int main()
{
    FUN(3);  //调用指定函数test3()
    return 0;
}
int test3()
{
    cout << "test3 printed,ok!" << endl;
    return 0;
}

我希望用变量代替test3中的3.
下面是我对两次尝试,均未成功。恳求指导。谢谢!

//尝试一:试图用常变量代替3。失败
#define FUN(n) test##n();   //宏定义

constexpr int i = 3;
int FUN(i)   //函数声明语句,宏展开为:testi();  i 未被转化为3

int main()
{
    FUN(i);  //拟调用指定函数test3(),失败
    return 0;
}

//尝试二:试图用宏定义代替3。失败
#define FUN(n) test##n();   //宏定义
#define i 3;

int FUN(i)   //函数声明语句,i虽然展开为3,但仍报错。好像仍展开为:testi();  

int main()
{
    FUN(i);  //拟调用指定函数test3(),失败
    return 0;
}


int test3()
{
    cout << "test3 printed,ok!" << endl;
    return 0;
}
我想要达到的结果

我希望用变量代替test3中的3.

你需要再加一层宏展开

#include <iostream>

#define i 3
#define FUN1(n) test##n()
#define FUN(n) FUN1(n)

int FUN(i);

using namespace std;

int main()
{
    FUN(i);
    return 0;
}

int test3()
{
    cout << "test3 printed,ok!" << endl;
    return 0;
}