У меня есть это:
#if sizeof(int)
#error Can't use sizeof in a #if
#endif
Я получаю эту ошибку компилятора:
missing binary operator before token "("
Почему я не могу использовать здесь оператор sizeof?
У меня есть это:
#if sizeof(int)
#error Can't use sizeof in a #if
#endif
Я получаю эту ошибку компилятора:
missing binary operator before token "("
Почему я не могу использовать здесь оператор sizeof?
Потому что sizeof() вычисляется после запуска препроцессора, поэтому информация недоступна для #if
.
C логически разделены на две фазы, даже если большинство современных компиляторов их не разделяют. Во-первых, источник предварительно обработан. Это включает в себя разработку и замену всех условий препроцессора (#if, #define, замена определенных слов на их замены). Затем источник передается, обрабатывается, самому компилятору. Препроцессор только в минимальном понимании структуры C, он не имеет знания типа, поэтому он не может обрабатывать конструкции на уровне компилятора, такие как sizeof().
Потому что вы можете использовать только литерал-константы в директиве препроцессора. Кроме того, sizeof (int) всегда больше, чем 0, поэтому я считаю, что это #if будет истинным все время в любом случае.
#if - это препроцессорная директива.
sizeof() является оператором C и вычисляется во время компиляции.
Во время препроцессора (когда обрабатывается #if) операторы C не выполняются.
Рассмотрим:
#if sizeof(MyClass) > 3
#define MY_CONSTRAINT 2
#endif
class MyClass
{
#if MY_CONSTRAINT == 3
int myMember = 3;
#endif
};
Теперь это непродолжительно не написано в правильном синтаксисе, поскольку это было какое-то время с момента последнего С++, но точка все еще стоит:)
просто используйте обычный if-else
if (sizeof(x)==2) {...}
else if (sizeof(x)==4) {...}
else {...}
и компилятор будет оптимизировать его во время компиляции...