/*********************************************************************
* Author : lile
* Modified : 2019年12月28日星期六 10:56:13
* Email : roger0212@163.com
* HomePage : lile777.blog.csdn.net
* CopyRight : 该文章版权由lile所有。
* 保留原文出处链接和本声明的前提下,可在非商业目的下任意传播和复制。
* 对于商业目的下对本文的任何行为需经作者同意。
*********************************************************************/
1. 编译警告
warning: missing braces around initializer
warning: (near initialization for 'col_attr_s.reserved')
warning: initialization makes integer from pointer without a cast```
2. 参阅资料
http://blog.csdn.net/yihongxiaoxiang/article/details/50345513
下面说明一下结构体的初始化:
结构体的初始化方式和数组的初始化很类似。一个位于一对大括号内部、由逗号分隔的初始化值列表可用于结构体各成员的初始化。这些值根据结构成员列表的顺序写出。如果初始化列表的值不够,剩余的结构成员将使用默认的值进行初始化。
那这样下来,怎么会出现warning呢?
我们先来回顾一下结构体的定义:结构体时一种将不同类型的数据组合成一个有机整体的聚合数据类型。那么如果结构体中的成员的类型是数组或者结构体时呢?那么这个时候你再仅仅只是用一个大括号来对结构体进行初始化时,就会出现定义不明确的问题了,此外如果对一个多维数组你也只使用一个大括号来进行初始化时,同样也会出现定义不明确的问题。虽说一般编译器会自动将结构中的值按空间顺序依次进行赋值,但是编译器依旧会报一个warning,当然前提是你已经设置了-Wall或者-Wmissing-braces。例如:
struct point
{
int x;
int y;
};
struct line {
struct point start;
struct point end;
};
typedef struct line line;
int main()
{
int array1[2][2] = {11, 12, 13, 14};
int array2[2][2] = {{11, 12}, {13, 14}}; //修正 ok
line l1 = {1, 1, 2, 2};
line l2 = {{2, 2}, {3, 3}}; //修正 ok
return 0;
}
gcc -Wmissing-braces test_missing_braces.c test_missing_braces.c: In function `main':
test_missing_braces.c:19: warning: missing braces around initializer
test_missing_braces.c:19: warning: (near initialization for `array1[0]')
test_missing_braces.c:21: warning: missing braces around initializer
test_missing_braces.c:21: warning: (near initialization for `l1.start')
这里19行出现warning的原因是仅使用了一个大括号来进行初始化,这时编译器会通过自动分行来对每一个元素进行初始化,同理,第21行也是同样的原因。其修正结果分贝为20和22行。
那既然可以自动赋值为什么还报warning呢?这是因为,有时候我们想要的赋值并不是依次赋值的,例如我想array1[1][0]不赋值而array[1][1]=14,
如果只使用大括号的情况是:
array1[2][2] = {11, 12, 14},
结果是
array1[1][0]=14,而array1[1][1]=0,
这样的结果并不是编程者需要的,所以编译器需要提示你检查对应的地方是否是你需要的或者你需要规范一下代码,来避免这种隐藏的问题或者错误。
3. 修正
typedef struct Pt_list_columns_attrs {
unsigned flags;
unsigned reserved[ 3 ];
}PtListColumnAttributes_t;
PtListColumnAttributes_t col_attr ;
// 原代码:
unsigned flags = Pt_LIST_COLUMN_CENTER ;
unsigned reserved[ 3 ] = { 0 } ;
PtListColumnAttributes_t col_attr_s = { flags, reserved } ;
//第一次修正后
unsigned flags = Pt_LIST_COLUMN_CENTER ;
unsigned reserved[ 3 ] = { 0, 0, 0 } ;
PtListColumnAttributes_t col_attr_s = { flags, {reserved[ 0 ], reserved[ 1 ], reserved[ 2 ]} } ;
//第二次修正后
PtListColumnAttributes_t col_attr_s = { Pt_LIST_COLUMN_CENTER, {0, 0, 0} } ;
4. 总结
对于 非基本变量的初始化,每一个 group (数组、结构体等)均需要用 { } 隔离开来, 精确到每一个 Byte 对应一个Byte内存空间。