Designated Initialization in C

With designated initialization, each designator names a direct non-static data member (or a struct), like so:

struct A { int x; int y; int z; };
struct A a1 = {.x = 1, .y = 2};
struct A a2 = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order)

Out-of-order designated initialization, nested designated initialization, mixing of designated initializers and regular initializers, and designated initialization of arrays are all supported in the C programming language, but are not allowed in C++.

struct A { int x, y; };
struct B { struct A a; };

struct A a = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order)
int arr[3] = {[1] = 5};        // valid C, invalid C++ (array)
struct B b = {.a.x = 0};       // valid C, invalid C++ (nested)
struct A a = {.x = 1, 2};      // valid C, invalid C++ (mixed)