Почему gcc не допускает использование const int в качестве выражения case? - PullRequest
28 голосов
/ 11 ноября 2009

Я смотрел на этот ТАК вопрос и задумался о константных выражениях против #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, что

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

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

1 Ответ

27 голосов
/ 11 ноября 2009

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

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

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