Могут ли инициализированные члены структуры не служить целочисленными константами в C? - PullRequest
0 голосов
/ 22 января 2020

Я объявил и инициализировал структуру в верхней части файла следующим образом:

struct myDataTypes {
    int INT;
    int DOUBLE;
    int FLOAT;
} types = {0,1,2};

Когда я пытаюсь использовать types.INT в case из switch, я получаю ошибка компилятора в том, что case label does not reduce to an integer constant. Неужели члены структуры не могут работать как целочисленные константы?

Кстати, я использую для этого структуру, а не перечисление, потому что перечисления загрязняют глобальное пространство имен. Я предпочитаю, как я могу скрыть INT, DOUBLE, FLOAT в структуре.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Та же ошибка, например:

int a = 0;
int b = 0;
switch (b)
{
    case a:
...

Может быть разрешена до:

const int a = 0;
int b = 0;
switch (b)
{
    case a:
...

В настоящее время я использую то же самое 'скрытие enum', чтобы mimi c ' модули в C. Я не могу разрешить это, даже если я определяю struct как const или даже stati c const.

0 голосов
/ 22 января 2020

switch-case оператор является синтаксическим сахаром команды перехода по условию. case label преобразуются в goto эквивалент во время компиляции. В вашем случае types является структурной переменной, и компилятор не сможет вывести для нее эквивалентную метку.

из [6.8.4.2 оператора switch]

Выражение метка каждого регистра должна быть выражением целого числа

...