2009-10-23 4 views
13

sizeof는 컴파일 타임에 정수 상수로 평가되는 연산자라는 것을 알고 있습니다.전처리 조건에서 sizeof를 사용할 수없는 이유는 무엇입니까?

#if 4 == sizeof(int) 
    typedef int Int32; 
#endif 

왜 이러한 사용되지 않습니다 (Cygwin에서-GCC 3.4.4뿐만 아니라 비주얼 C++ 6.0 보고서가 오류를 컴파일) : 그러나이 같은의 #if 전처리 지시어에 사용할 수없는 것 허용 되었습니까? sizeof는 지시가 전에 컴파일, 그 컴파일러하지 않는 부분을 평가하는 동안 컴파일 시간에 평가되는, 그래서 어떤 sizeof 수단 이해하지 못할

답변

19

때문입니다.

+1

실제로 전처리는 컴파일 중 발생하며 이전 단계 중 하나에서만 발생합니다. 'sizeof' 평가는 나중 단계에서 발생합니다. – sbi

+4

@sbi 전처리는 컴파일의 일부가 아닙니다. 컴파일러는 일반적으로 실제 컴파일 전에 선행 처리기를 실행하지만 컴파일러에서 그렇게하지 않도록 지시 할 수 있습니다. RichN의 대답은 100 % 정확합니다. – qrdl

+0

음, 틀 렸지만 전문 용어로만 : 번역의 단계 중 하나입니다. 이 http://stackoverflow.com/questions/1476892/1479972#1479972에 따르면 "컴파일"이라는 단계가 없으므로 해석의 의미가있는 것 같습니다. – sbi

10

sizeof는 C 연산자입니다. 선행 처리기 지시문에 C 코드를 사용할 수 없습니다. 사전 처리기 지시문은 컴파일이 수행되기 전에 평가됩니다.

+0

첫 번째가 있습니다. –

+0

"=="도 연산자입니다. RichN의 대답은 문제가 좀 더 명확하게 지적합니다. – felix0322

+2

@ felix0322 : 전 처리기에는 전 처리기 지시문에 사용되는 '=='연산자가 있습니다. – sbi

관련 문제