Может быть предпочтительнее, если бы было написано:
const struct entry keywords[] =
{
{ "div", DIV },
{ "mod", MOD },
{ 0, 0 }
};
, который использует фигурные скобки вокруг каждой подструктуры (и, вероятно, должно быть const
на указателе в определении структуры, а также намассив), но вы можете инициализировать статический массив структур и использовать его для инициализации локальных массивов.
Кроме того, в C99 вы можете использовать назначенные инициализаторы:
const struct entry keywords[] =
{
[0] = { .lexptr = "div", .token = DIV },
[1] = { .lexptr = "mod", .token = MOD },
[2] = { .lexptr = 0, .token = 0 }
};
В этом примере нет никакого преимущества для обозначения (я бы не использовал его), но в более сложных случаях, когда, возможно, только несколько из множества полей в структуре должны быть инициализированы в каждой строкеназначенные инициализаторы могут иметь преимущество.Вы также можете иметь инициализаторы вне последовательности.Опять же, вы не будете использовать это здесь, но если у вас есть enum
для записей, вы можете использовать [ENUMX] = { ... }, [ENUMY] = { ... }, ...
без необходимости знать номер, соответствующий ENUMX и ENUMY.(Примечание: я мог бы использовать обозначения индексации без обозначений элементов или обозначения элементов без обозначений индексации; я показал оба, чтобы проиллюстрировать диапазон вариантов.)
Гораздо лучше использовать инициализацию, чемисполняемый код, который вы показываете в качестве альтернативы.Инициализация статических или глобальных массивов выполняется системой при загрузке программы, что сокращает время выполнения и уменьшает объем кода в исполняемом файле (и то и другое желательно).Это также позволяет сделать структуры постоянными, чтобы они не могли быть изменены во время выполнения.Присвоение требует, чтобы структура была модифицируемой.