Почему я не могу использовать sizeof в состоянии препроцессора?

Я понимаю, что sizeof - это оператор, который вычисляется во время компиляции до целочисленной константы. Но, похоже, его нельзя использовать в директиве препроцессора #if, например:

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

(cygwin-gcc 3.4.4, а также Visual C ++ 6.0 сообщают об ошибках компиляции)

Почему такое использование запрещено?


person felix0322    schedule 23.10.2009    source источник


Ответы (2)


Поскольку sizeof оценивается во время компиляции, в то время как директивы оцениваются перед компиляцией, а часть, которая это делает, не является компилятором, поэтому он не поймет, что означает sizeof.

person RichN    schedule 23.10.2009
comment
Фактически предварительная обработка происходит во время компиляции, как раз на одном из ранних этапов. Оценка sizeof происходит на более позднем этапе. - person sbi; 23.10.2009
comment
@sbi Предварительная обработка не является частью компиляции - компилятор обычно запускает препроцессор перед фактической компиляцией, но вы можете указать компилятору не делать этого. Ответ RichN на 100% правильный. - person qrdl; 23.10.2009
comment
Что ж, я ошибся, но только в терминологии: это один из этапов перевода. Согласно этому stackoverflow.com/questions/1476892/1479972#1479972, также нет фазы, называемой компиляцией, так что подразумевается под этим, кажется открытым для интерпретации. - person sbi; 24.10.2009
comment
Могу поклясться, что видел это раньше. Может, я ошибаюсь. - person flarn2006; 06.09.2020

Sizeof - это оператор C. Вы не можете использовать код C в директивах препроцессора. Директивы препроцессора оцениваются перед компиляцией.

person kgiannakakis    schedule 23.10.2009
comment
== также является оператором. Ответ от RichN указывает на то, что проблема для меня немного яснее. - person felix0322; 23.10.2009
comment
@ felix0322: препроцессор имеет свой собственный оператор ==, который используется в директивах препроцессора. - person sbi; 23.10.2009