Подтвердить что ты не робот

Почему gcc разрешает const int как выражение case?

Я смотрел на этот вопрос SO и думал о const ints по сравнению С#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 должна быть целочисленной константой выражение и два случая постоянные выражения в одном и том же оператор switch должен иметь одинаковый значение после преобразования.

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

4b9b3361

Ответ 1

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

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