Why is this type of C99 struct initialisation not allowed? If (not) possible, please explain.
struct Point {int x; int y;};
struct Data {struct Point p;};
struct Data data = {0};
data.p = {.x = 2, .y = 4};
However, this is allowed:
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;
Edit: data = {} -> data = {0}
CodePudding user response:
Neither code sample is allowed in strictly conforming C; the grammar requires that there be at least one initializer inside the braces, so struct Data data = {}; is incorrect. (It can be corrected to struct Data data; or struct Data data = {0};.)
data.p = {.x = 2, .y = 4}; is an assignment, not initialization. In the standard C grammar, the right operand of an assignment must be an expression (specifically an assignment-expression). The source code {.x = 2, .y = 4} is not an expression; there is no expression that starts with {. The source code p is an expression, so it can be the right operand of an assignment.
You can use data.p = (struct Point) {.x = 2, .y = 4};. In this , (struct Point) {.x = 2, .y = 4} is a compound literal, which does form an expression.
