Почему 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) счастливым.

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

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