2

我定义了类似的宏,只是它们的区别是数字。例如

#define Function_01_Call(param)  (FunctionName((int)01, param))
#define Function_02_Call(param)  (FunctionName((int)02, param))
#define Function_03_Call(param)  (FunctionName((int)03, param))
#define Function_04_Call(param)  (FunctionName((int)04, param))

我想使用宏Function_XX_Call调用函数FunctionName。如何将一个字符串用于宏并更改其数字?我试过了

#define FUNCTION_CALL(num)   Function_num_Call

 int main()
 {
    char num;
    for(num = "01"; num<="04"; num++)
    {
       FUNCTION_CALL(num); //HOW TO PASS param HERE?
    }
  }

但是如何在调用期间动态更改数字,因为变量不能在宏中使用。另外如何在通话期间传递参数?有没有办法使用函数指针?

4

2 回答 2

4

如何动态更改数字

最好的方法是创建调用者和查找表。所以完全忽略整个处理器的东西,然后转移到运行时。

void function_call_01(int param) { Function_01_Call(param); }
void function_call_02(int param) { Function_02_Call(param); }
void function_call_03(int param) { Function_03_Call(param); }
void function_call_04(int param) { Function_04_Call(param); }

static void (*const function_calls[])(int) {
    function_call_01,
    function_call_02,
    function_call_03,
    function_call_04,
};
static const function_calls_cnt = sizeof(function_calls)/sizeof(*function_calls);

void function_call(size_t idx, int param) {
   assert(idx < function_calls_cnt);
   function_calls[idx](param);
}

int main() {
    for (size_t i = 0; i < function_calls_cnt; ++i) {
         function_call(i, 62);
    }
}

预处理器是静态的,编译后无法更改。如果你想让任何东西依赖于运行时的东西,你必须在运行时而不是在预处理器中编写它。

函数列表和数组定义可以用类似或类似的 FOREACH 宏“缩短P99_SEQBOOST_PP_SEQ_FOR_EACH

于 2021-04-16T07:37:15.703 回答
2

你不能!

因为 for 循环将在运行时执行,但宏在预处理器阶段被扩展,甚至在编译之前。显然 的值num是未知的,当时无法在宏中展开。

for(num = 1; num<=4; num++)
{
   FUNCTION_CALL(num); //HOW TO PASS param HERE?
}

顺便提一句。您不能将两个字符串存储在char

你可以做类似的事情

#define __PASTE1(a,b,c)  __PASTE2(a,b,c)
#define __PASTE2(a,b,c)  a##b##c
#define FUNCTION_CALL(num,param)   __PASTE1(Function_,num,_Call)(param)

int main()
{
  FUNCTION_CALL(01); // Expands to Function_01_Call(param)
  FUNCTION_CALL(02);
  FUNCTION_CALL(03);
  FUNCTION_CALL(04); // Expands to Function_04_Call(param)
}
于 2021-04-16T07:01:22.657 回答