2009-10-23 10 views
13

Rozumiem, że sizeof jest operatorem, który jest oceniany w czasie kompilacji na stałą całkowitą. Ale wydaje się, że nie może być stosowany w dyrektywie preprocesora #if jak:Dlaczego nie mogę używać sizeof w stanie preprocesora?

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

(Cygwin-gcc 3.4.4 oraz C++ 6.0 raport wizualna błędy kompilacji)

Dlaczego jest taki zwyczaj nie dozwolony?

Odpowiedz

19

Ponieważ sizeof jest oceniana w czasie kompilacji, podczas gdy dyrektywy są oceniane przed kompilację, a część, że robi to nie jest kompilator, więc nie rozumiem, co sizeof środki.

+1

Rzeczywiście wstępne przetwarzanie odbywa się podczas kompilacji, tylko w jednej z wcześniejszych faz. Ocena 'sizeof' dzieje się w późniejszej fazie. – sbi

+4

@sbi Preprocessing nie jest częścią kompilacji - kompilator zwykle uruchamia preprocesor przed właściwą kompilacją, ale możesz poinstruować kompilator, aby tego nie robił. Odpowiedź RichN jest w 100% poprawna. – qrdl

+0

Cóż, myliłem się, ale tylko w terminologii: To jedna z faz _Translation_. Zgodnie z tym http://stackoverflow.com/questions/1476892/1479972#1479972, nie ma fazy zwanej "kompilacją", więc to, co jest z tym związane, wydaje się być otwarte na interpretację. – sbi

10

Wielkośćof jest operatorem litery C. Nie można używać kodu C w dyrektywach preprocesora. Wytyczne preprocesora są oceniane przed kompilacją.

+0

Masz ich pierwszy! –

+0

"==" jest także operatorem. Odpowiedź Richna wskazuje, że problem jest dla mnie bardziej zrozumiały. – felix0322

+2

@ felix0322: Preprocesor ma swój własny operator '==', który jest używany w dyrektywach preprocesora. – sbi