Почему я не могу использовать sizeof() в #if?

У меня есть это:

#if sizeof(int)
    #error Can't use sizeof in a #if
#endif

Я получаю эту ошибку компилятора:

missing binary operator before token "("

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

Ответ 1

Потому что sizeof() вычисляется после запуска препроцессора, поэтому информация недоступна для #if.

Компиляторы

C логически разделены на две фазы, даже если большинство современных компиляторов их не разделяют. Во-первых, источник предварительно обработан. Это включает в себя разработку и замену всех условий препроцессора (#if, #define, замена определенных слов на их замены). Затем источник передается, обрабатывается, самому компилятору. Препроцессор только в минимальном понимании структуры C, он не имеет знания типа, поэтому он не может обрабатывать конструкции на уровне компилятора, такие как sizeof().

Ответ 2

Потому что вы можете использовать только литерал-константы в директиве препроцессора. Кроме того, sizeof (int) всегда больше, чем 0, поэтому я считаю, что это #if будет истинным все время в любом случае.

Ответ 3

#if - это препроцессорная директива.
sizeof() является оператором C и вычисляется во время компиляции.

Во время препроцессора (когда обрабатывается #if) операторы C не выполняются.

Ответ 4

Рассмотрим:

#if sizeof(MyClass) > 3
   #define MY_CONSTRAINT 2
#endif

class MyClass
{
   #if MY_CONSTRAINT == 3
      int myMember = 3;
   #endif
};

Теперь это непродолжительно не написано в правильном синтаксисе, поскольку это было какое-то время с момента последнего С++, но точка все еще стоит:)

Ответ 5

просто используйте обычный if-else

if      (sizeof(x)==2)  {...}
else if (sizeof(x)==4)  {...}
else                    {...}

и компилятор будет оптимизировать его во время компиляции...