나는이 SO question을보고 const ints 대 #defines에 대해 생각해 보았고 실제로 컴파일러가이 문제를 처리 할 수없는 이유를 실제로 이해하지 못한다는 것을 깨달았다. 누군가가gcc가 const int를 대문자로 허용하지 않는 이유는 무엇입니까?
error: case label does not reduce to an integer constant
에
const int FOO = 10;
int main(int argc, char** argv)
{
switch(argc)
{
case FOO: { printf("foo\n"); }
default: { printf("default\n"); }
}
}
결과 이유를 다음 코드로 되거 수 나는 6.8.4.2.3에 내용의 ISO-C99 사양을 읽어
각각의 경우 레이블 의 표현은 정수 상수 이어야하며 두 개의 경우는 동일하지 않습니다. 동일한 상수 표현 스위치 명령문은 변환 후 동일한 값을 가져야합니다.
나는 왜 그 표현식이 일정해야하는지 이해하지만 왜 리터럴만으로는 컴파일러 (gcc 4.2.1)가 행복하지는 않은지 이해한다.
흥미롭게도 gcc-4.3.4에서 코드가 제대로 컴파일되어 실행되는 것 같습니다. http://ideone.com/n1bmIb 편집 : 아 .. C.가 아니라 C++ 일뿐입니다. – GrahamS