gpt4 book ai didi

c - 使用 # 和 ## 运算符的嵌套宏实现

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:09 27 4
gpt4 key购买 nike

我正在编写一个通用函数,它将采用宏名称并执行正确的函数。

我正在编写一个函数,它将从宏中获取函数名并将其连接起来并执行该函数。我在我的工作区中添加了这个头文件,其中有多个 c 文件使用这个宏实现逻辑来执行我的代码。但是我运行代码时出现错误。

#define STR(name) #name

int convert_f14u18(int a,int b);
int convert_f14s18(int a,int b);

#define VAL_F 14
#define DATA_SIGN u
#define VAL_NUM 18

#define EXECUTE_FUN_NAME(a,b,c,d,e) a##b##c##d##e
#define EXECUTE_STATEMENT(a,b,c,d,e,f) b##c##d##e#f=EXECUTE_FUN_NAME(a,b,c,d,e)

typedef int u32;
u32 add_u32(u32 a,u32 b);

int main() {

//Testing of string macro
printf(STR(Hello));

int numa = 10;
int numb = 20;
int numc = 30;


//int z1 = EXECUTE_FUN_NAME(convert_,f,14,u,18)(numa,numb);
int z1 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numb);

//int z2 = EXECUTE_FUN_NAME(convert_,f,14,s,18)(numa,numc);
int z2 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numc);


printf("\nz1 %d\n",z1);
printf("z2 %d\n",z2);


return 0;
}


int convert_f14u18(int a,int b){
return (a+b);
}
int convert_f14s18(int a,int b){
return (a+b);
}

u32 add_u32(u32 a,u32 b){
return (a+b);
}
Error:../main.cpp: In function ‘int main()’:
../main.cpp:37:76: error: ‘convert_fVAL_FDATA_SIGNVAL_NUM’ was not declared in this scope
int z1 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numb);

预期结果:如果我在主语句中取消对上面实际宏语句的注释并注释当前宏语句,我就能够运行代码。但我想让我的代码以当前逻辑运行。

最佳答案

当替换一个宏时,C 首先用它的实参替换每个形参。例如,参数 c 被替换为 VAL_F。然后它应用 ## 运算符,在此示例中生成 convert_fVAL_FDATA_SIGNVAL_NUM。然后 C 检查要替换的其他宏的结果。但是,此时,诸如 VAL_F 之类的参数已被制成带有 ## 的单个标记,不再是将被替换的单个标记。

要解决这个问题,请使用一个宏来替换参数,然后使用另一个宏来应用 ## 运算符。变化:

#define EXECUTE_FUN_NAME(a,b,c,d,e)  a##b##c##d##e

到:

#define EXECUTE_FUN_NAME_HELPER(a, b, c, d, e)  a##b##c##d##e
#define EXECUTE_FUN_NAME(a, b, c, d, e) EXECUTE_FUN_NAME_HELPER(a, b, c, d, e)

关于c - 使用 # 和 ## 运算符的嵌套宏实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56426620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com