为何C99不允许此类结构体初始化方式?请解释原因
C99结构体赋值语法疑问解答
不被C99允许的写法
struct Point {int x; int y;}; struct Data {struct Point p;}; struct Data data = {0}; data.p = {.x = 2, .y = 4};
被C99允许的写法
struct Point {int x; int y;}; struct Data {struct Point p;}; struct Data data = {0}; struct Point p = {.x = 2, .y = 4}; data.p = p;
原因解释
{.x = 2, .y = 4}是C99引入的指定初始化器,它属于变量初始化语法,只能用在声明变量的同时完成赋值的场景,不能作为普通赋值语句的右值使用。第一个例子里的data.p = {.x = 2, .y = 4};是对已经初始化好的结构体成员做赋值操作,这时候指定初始化器不是合法的表达式,因此C99不允许这种写法。- 第二个例子里,
struct Point p = {.x = 2, .y = 4};是合法的变量初始化,先创建并初始化了一个同类型的结构体变量p,之后data.p = p;是结构体变量之间的直接赋值,C99允许同类型结构体变量直接赋值,本质是把p的每个成员值逐拷贝给data.p,所以这种写法是合规的。
内容的提问来源于stack exchange,提问作者kevinarpe
相关产品推荐
相关产品推荐

