ошибка: метка регистра не сводится к целочисленной константе для символов, выбранных из строкового литерала - PullRequest
1 голос
/ 06 марта 2019

Я получаю эту ошибку при компиляции этого кода с gcc 8.2:

#define literal "string"
switch(i) {
case literal[0]:
break;
}

Может ли компилятор уменьшить выражение литерал [0] до 's' в моем примере?

Ответы [ 3 ]

5 голосов
/ 06 марта 2019

C2011 6.4.8.2p3 требует, чтобы каждое выражение метки случая было целочисленным константным выражением .Целочисленные константные выражения являются ограниченным подмножеством константных выражений, определенных в § 6.6p6 .Строковые литералы могут не отображаться в целочисленных константных выражениях.

6.4.8.2p3 - это абзац «ограничений», поэтому эта программа некорректна.

Итак, ответ на ваш вопрос в буквальном смыслеспросил: компилятор может уменьшить "string"[0] до 's', но это не разрешено;вместо этого требуется отклонить вашу программу.

1 голос
/ 06 марта 2019

В этом примере теоретически да, это может.

Однако, очевидно, что это не так.Таким образом, вы все равно должны писать свой код по-другому.

Чтобы расширить ответ Флориана:

В C ++ с использованием литерала или constexpr это, очевидно, работает.

Примеркоторый компилируется с g++ -std=c++17 -pedantic -O3 -DNDEBUG -flto -march=native -Wall -Wextra -Werror cpp-switch-test.cpp -o cpp-switch-test

int main(int, char *argv[]) {
    constexpr char s[] = "string";
    switch (argv[1][0]) {
        case *s:
            break;
        case s[4]:
            break;
        case "test"[0]:
        default:
            return 1;
    }
    return 0;
}
0 голосов
/ 06 марта 2019

Компилятор C может обрабатывать дополнительные выражения как выражения целочисленных констант, поэтому компилятор также может рассматривать это как константу.

Вместо этого вы можете использовать текущий компилятор C ++: C ++ 11 и более поздние версии обрабатывают такие выражения как константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...