【发布时间】:2013-11-18 19:28:23
【问题描述】:
我正在尝试使用 c 令牌粘贴 (##) 来访问结构字段,如下所示:
typedef struct
{
int a;
int b;
} TMP_T;
#define BUILD_FIELD(field) my_struct.##field
int main()
{
TMP_T my_struct;
BUILD_FIELD(a) = 5;
return 0;
}
但在编译过程中出现以下错误: 错误:粘贴“。”并且“a”没有给出有效的预处理令牌
我想为此添加额外的案例:
typedef struct {
int a;
int b;
}TMP_T;
#define BUILD_FIELD(my_struct,field) my_struct.##field
void func(char* name)
{
TMP_T tmp_str;
if((name == "a") || (name == "b"))
{
BUILD_FIELD(tmp_str, name) = 7;
printf("%d \n", BUILD_FIELD(a) );
}
}
int main()
{
func("a");
return 1;
}
我应该如何使用宏来访问特定的结构和字段。是否可以?或者因为它是预编译的,所以无法为各种字段(a,b)定义它
谢谢 莫提
【问题讨论】:
-
这是完全错误的。您不能将宏与运行时的东西混合使用。宏处理在预处理之后结束,甚至在编译之前。也许您需要一种脚本语言。最后,您不能将字符串与
==进行比较。 -
在下面我的回答中解决您的最后一次编辑。同意@perreal 的两个观察。