【发布时间】:2018-06-19 17:33:14
【问题描述】:
在我正在处理的项目中,我有一个类似于此的代码:
#include<stdio.h>
struct parameter_struct{
char *parameter_name;
int parameter_value;
};
int main(){
struct parameter_struct param1= {"x_custom_param1", 6};
printf("parameter name: %s\n", param1.parameter_name);
return 0;
}
我现在需要实现的是使用预定义的宏使参数名称动态化:
#define macro_custom "x_custom1_"
所以参数名称应该是与“param1”子字符串连接的宏值。我的意思是它将是“x_custom1_param1”而不是实际的静态值“x_custom_param1”。
在我的项目中,所有参数都是这样静态声明的:
{"x_custom_param1", 6};
而且我不能碰这种代码结构。所以我不能在c函数中动态初始化这些参数,例如在这个函数中使用strcat。
所以我想到的是使用另一个#define with ## 语句。所以我的代码会是这样的:
#include<stdio.h>
#define macro_custom "x_custom1_"
#define f(g,h) g##h
struct parameter_struct{
char *parameter_name;
int parameter_value;
};
int main(){
struct parameter_struct param1= {f(macro_custom, "param1"), 6};
printf("parameter name : %s\n", param1.parameter_name);
return 0;
}
但我得到一个编译错误:
error: pasting "macro_custom" and ""param1"" does not give a valid preprocessing token
struct parameter_struct param1= {f(macro_custom, "param1"), 6};
这似乎是合乎逻辑的,因为我定义的宏没有返回带有##的字符串
有人知道如何纠正我的想法吗?还是有更好的主意?
【问题讨论】:
标签: c concatenation c-preprocessor preprocessor-directive