Размер массива длины перечисления дает ошибку компиляции - PullRequest
0 голосов
/ 27 февраля 2019

Посмотрите на приведенный ниже код,

Этот код прекрасно компилируется:

enum ids {
    X,
    Y,
    NUM_IDS,
}

void some_func(void)
{
    static char* const names[NUM_IDS] = { "name X" , "name Y"};
}

Однако этот код не компилируется: ошибка: размер хранилища 'names'не константа

enum ids {
    X,
    Y,
    NUM_IDS,
}

void some_func(void)
{
    int nr_names = NUM_IDS;
    static char* const names[nr_names] = { "name X" , "name Y"};
}

Мне кажется, я неправильно понял значение константного выражения.Это тот случай, когда вторым способом становится VLA, которого нет в C90?Кто-нибудь, пожалуйста, уточните.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Проблема заключается в том, что VLA не разрешено иметь статическую продолжительность хранения

Цитирование из ISO 9899 6.7.5.2 Деклараторы массива

Если идентификатор объявлен как объект сдлительность статического хранения, он не должен иметь тип массива переменной длины.

Таким образом, вам вообще не разрешается объявлять статический VLA.Поскольку nr_names не является константой, вам не разрешено использовать статический код во втором коде.

Первый код верен, поскольку NUM_IDS является константным выражением.

Другая проблема с вашимВторой код заключается в том, что VLA не может быть инициализирован.

Я цитирую из ISO 9899 6.7.8 Инициализация

Тип инициализируемого объекта должен быть массивом неизвестного размера или типом объекта, который не является массивом переменной длинытип

0 голосов
/ 27 февраля 2019

static char* const names[nr_names] - это VLA, поскольку nr_names не является константным выражением, а является (неконстантным) int.Конечно, в этом коротком примере он всегда равен NUM_IDS, но вы все равно не можете этого сделать.


На несвязанном примечании рекомендуется, чтобы char было определено как const, так как его модификация не будет работать, потому что она является частью двоичного файла программы (в C ++ она не позволяет иметь ее неконстантно):

static const char* const names[NUM_IDS] = { "name X" , "name Y" };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...