C语言使用宏初始化结构体的问题
2017-08-07 14:32
288 查看
Linux内核源码中广泛的使用宏来进行结构体对象定义和初始化,但是进行对象初始化的时候需要注意宏参数和结构体成员名冲突的问题,下面进行简单测试说明,编写一个程序创建一个结构体,然后使用宏进行结构体初始化:
编译后发现错误:
单看错误我是真没找到有什么问题,后来发现宏参数名和结构体的成员名相同,我猜想宏展开之后会不会出现奇异,例如12行的“.id = id”会被展开成“.0 = 0”而不是“.id = 0”,所以我将程序的宏修改了一下宏参数:
修改后编译无错,运行正常,不知道问题是不是我猜想的那样,反正宏参数名和结构体的成员名不要相同就行了。
1 #include "stdio.h" 2 3 struct guy 4 { 5 int id; 6 char *name; 7 int age; 8 }; 9 10 #define NEW_GUY(id,name,age) \ 11 { \ 12 .id = id, \ 13 .name = name, \ 14 .age = age, \ 15 } 16 17 int main() 18 { 19 struct guy guy1 = NEW_GUY(0,"tangquan",22); 20 printf("%d,%s,%d\r\n",guy1.id,guy1.name,guy1.age); 21 return 0; 22 } 23
编译后发现错误:
tq@ubuntu:/mnt/hgfs/vmshare$ gcc test.c -o tar test.c: In function ‘main’: test.c:19:28: error: expected identifier before numeric constant struct guy guy1 = NEW_GUY(0,"tangquan",22); ^ test.c:12:3: note: in definition of macro ‘NEW_GUY’ .id = id, \ ^ test.c:13:2: error: expected ‘}’ before ‘.’ token .name = name, \ ^ test.c:19:20: note: in expansion of macro ‘NEW_GUY’ struct guy guy1 = NEW_GUY(0,"tangquan",22); ^ tq@ubuntu:/mnt/hgfs/vmshare$
单看错误我是真没找到有什么问题,后来发现宏参数名和结构体的成员名相同,我猜想宏展开之后会不会出现奇异,例如12行的“.id = id”会被展开成“.0 = 0”而不是“.id = 0”,所以我将程序的宏修改了一下宏参数:
1 #include "stdio.h" 2 3 struct guy 4 { 5 int id; 6 char *name; 7 int age; 8 }; 9 10 #define NEW_GUY(_id,_name,_age) \ 11 { \ 12 .id = _id, \ 13 .name = _name, \ 14 .age = _age, \ 15 } 16 17 int main() 18 { 19 struct guy guy1 = NEW_GUY(0,"tangquan",22); 20 printf("%d,%s,%d\r\n",guy1.id,guy1.name,guy1.age); 21 return 0; 22 } 23
修改后编译无错,运行正常,不知道问题是不是我猜想的那样,反正宏参数名和结构体的成员名不要相同就行了。
相关文章推荐
- C语言 结构体成员定义及使用问题
- 关于c语言中的结构体使用偏移量求值问题
- 关于C语言中的结构体对齐问题
- c语言中结构体的大小和内存对齐问题
- (2011.07.06)C++ 结构体中字符指针在main中使用new的赋值问题。
- c++与c语言的结构体实例化问题
- 一些内存使用问题(c语言)
- c语言中有关void,sizeof,结构体的一些问题
- 一道C语言笔试题——理解结构体的内存对齐和位域问题
- C语言中结构体对齐问题
- C语言结构体初始化出现 too many initializer values 问题
- c语言中结构体成员变量加“点”问题
- C语言项目中头文件/代码文件的组织问题(使用VC6.0)
- C语言结构体问题
- C语言自增、自减运算符使用中应注意的问题 王红
- 只要你的答案让我明白了如和使用Microsoft VisualC++6 但是我一点基础也没有。所以向大家请教 我想学习C语言 加分不是问题 还望得到大家的帮助 我一定把分数加到你满意为止
- c语言学习零碎整理(2):结构体对齐问题
- 关于C语言中的结构体对齐问题
- 关于C语言中的结构体对齐问题
- c语言指针使用的注意问题