C 如何使用宏或任何其他方式连接字符串

C 如何使用宏或任何其他方式连接字符串,c,embedded,c-preprocessor,dynamic-function,C,Embedded,C Preprocessor,Dynamic Function,我定义了类似的宏,只是它们的区别是数字。 e、 g 我想使用宏调用functionFunctionName。如何在宏的数字发生变化时使用一个字符串?我试过了 #define FUNCTION_CALL(num) Function_num_Call int main() { char num; for(num = "01"; num<="04"; num++) { FUNCTION_CALL(num);

我定义了类似的宏,只是它们的区别是数字。 e、 g

我想使用宏调用functionFunctionName。如何在宏的数字发生变化时使用一个字符串?我试过了

#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?
    }
  }
#定义函数调用(num)函数调用
int main()
{
字符数;
因为(num=“01”num你不能

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

for(num = 1; num<=4; num++)
{
   FUNCTION_CALL(num); //HOW TO PASS param HERE?
}
如何动态更改num

最好的方法是创建调用者和查找表,所以完全忽略所有处理器的内容,然后转到运行时

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);
    }
}
void函数调用(int-param){function调用(param)}
void函数_调用_02(int参数){function_02_调用(param);}
void函数_调用_03(int param){function_03_调用(param);}
void函数调用函数04(int-param){function函数调用函数04(param);}
静态void(*const函数_调用[])(int){
函数调用,
函数调用函数02,
函数调用03,
函数调用04,
};
静态常量function_calls_cnt=sizeof(function_calls)/sizeof(*function_calls);
void函数调用(size\t idx,int参数){
断言(idx
预处理器是静态的,编译后不能更改。如果您希望任何东西依赖于运行时,您必须在运行时编写它,而不是在预处理器中


使用FOREACH宏可以“缩短”函数列表和数组定义,如
P99\u SEQ
BOOST\u PP\u SEQ\u FOR_EACH
或类似的。这到底是什么意思?:
char num;FOR(num=“01”
您真正的问题是什么?请注意不同的“执行时间”宏和C代码:宏在编译过程中被扩展,但函数在运行时被调用。确实如此。为什么你会发现自己有这4个宏?谢谢你的回答!为什么这里使用两个不同的宏?为什么在宏中使用?还有什么意义?@a.BHi我的意思是,对于宏,我只是用它来表示它是一个内部宏。
##
是预处理器中的连接标记。在这种情况下,您不需要两个粘贴宏,我的习惯是避免其他问题,例如创建字符串。这是一个有价值的答案,因为有一个函数调用分派到四个单独的函数然而,OP的问题似乎表明他/她在寻找相反的结果:四个函数调用分配给一个函数。但是,这个问题再次令人困惑……我认为
#define function\u 01_Call(param)(FunctionName((int)01,param))中的
FunctionName
只是一个模板,在实际代码中,每个宏的
FunctionName
是不同的。OP想要实现
#define FUNCTION\u CALL(num)FUNCTION\u num\u CALL
调度。但是肯定-OP代码可以只是
FunctionName(i,param)
,因为所有4个宏都是相同的。。。
#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)
}
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);
    }
}