C11 Вложенная инициализация

Есть ли в C11 способ создать вложенную инициализацию для достижения того, что я описал в «test_successor_set»?

Поиски Google для вложенной инициализации C11 до сих пор не показали никаких примеров.

Возможно, это невозможно.

Я зашел так далеко, но я не могу заставить его работать.

typedef struct my_node_successor_struct {
   char *node_name;
   float cost;
} my_node_successor;

typedef struct my_node_successor_set_struct {
   const char *successor_name;
   my_node_successor *successors[];
} my_node_successor_set;

my_node_successor_set test_successor_set[] = {
 { .node_name = "S", .successors = { { .successor_name = "A", .cost = 2.f}, { .successor_name = "C", .cost = 3.f }, }},
 { .node_name = "A", .successors = { { .successor_name = "B", .cost = 1.f}, { .successor_name = "C", .cost = 1.f }, }},
 { .node_name = "C", .successors = { { .successor_name = "G", .cost = 3.f}, }},
 { .node_name = NULL, NULL },

};


c c11
person null    schedule 15.01.2015    source источник


Ответы (1)


No.

У вас есть структура с гибким элементом массива в конце (единственное место, где он может появиться). Но вы не можете инициализировать массивы таких структур, и вы не можете законно создать массив таких структур (поскольку все элементы массива должны быть одного размера, а смысл FAM в том, чтобы иметь переменные размеры, и в любом случае массив не учитывается в размере, поэтому в массиве FAM может быть только ноль элементов).

Соответствующий раздел стандарта ISO/IEC 9899:2011

§6.7.2.1 Спецификаторы структуры и объединения

¶3 Структура или объединение не должны содержать членов с неполным или функциональным типом (следовательно, структура не должна содержать экземпляр самой себя, но может содержать указатель на свой экземпляр), за исключением того, что последний член структуры с типом несколько именованных членов могут иметь неполный тип массива; такая структура (и любое объединение, содержащее, возможно, рекурсивно, член, который является такой структурой) не должен быть членом структуры или элементом массива.

¶18 В качестве особого случая последний элемент структуры с более чем одним именованным элементом может иметь тип неполного массива; это называется гибким членом массива. В большинстве случаев гибкий элемент массива игнорируется. В частности, размер структуры такой же, как если бы элемент гибкого массива был опущен, за исключением того, что он может иметь больше замыкающего заполнения, чем предполагалось бы при пропуске. Однако, когда оператор . (или ->) имеет левый операнд, который является (указателем) структурой с элементом гибкого массива, а правый операнд называет этот элемент, он ведет себя так, как если бы этот элемент был заменен самым длинным массивом (с тот же тип элемента), который не делал бы структуру больше, чем объект, к которому осуществляется доступ; смещение массива должно оставаться смещением гибкого элемента массива, даже если оно будет отличаться от смещения замещающего массива. Если этот массив не имеет элементов, он ведет себя так, как если бы он имел один элемент, но поведение не определено, если предпринимается какая-либо попытка получить доступ к этому элементу или сгенерировать указатель после него.

person Jonathan Leffler    schedule 15.01.2015