Почему gcc не допускает использование const int в качестве выражения case?

Я смотрел на этот SO вопрос и подумал о const-выражениях против #defines и понял, что на самом деле не понимаю, почему компилятор не может справиться с этим. Может ли кто-то пролить свет на то, почему следующий код

const int FOO = 10;

int main(int argc, char** argv)
{
    switch(argc)
    {
        case FOO: { printf("foo\n"); }
        default:  { printf("default\n"); }
    }
}

результаты в

error: case label does not reduce to an integer constant

Я прочитал спецификацию ISO-C99, которая гласит в 6.8.4.2.3, что

Выражение каждой метки case должно быть выражением целочисленной константы, и никакие два выражения константы case в одном и том же операторе switch не должны иметь одинакового значения после преобразования.

Я понимаю, почему выражение case должно быть постоянным, но не то, почему только литерал делает компилятор (gcc 4.2.1) счастливым.

1 ответ

Решение

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

Представьте, что произойдет, если другой файл объявлен extern const int FOO и попытался использовать это так же. Компилятор не знает, что FOO потому что это было определено в другом файле. Хотя оно имеет постоянное значение, оно не является постоянным выражением.

Другие вопросы по тегам