我有这个:
#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()这样的编译器级别构造。
defined()
)。一些预处理器允许大量的额外内容(我曾见过人们要求预处理器中拥有日志运算符,因为他们已经在嵌入式编译器中使用了它们)。 - Andrew Aylett考虑:
#if sizeof(MyClass) > 3
#define MY_CONSTRAINT 2
#endif
class MyClass
{
#if MY_CONSTRAINT == 3
int myMember = 3;
#endif
};
现在,这可能不是正确的语法,因为我已经有一段时间没有写C++了,但重点仍然存在 :)
只需使用普通的if-else语句
if (sizeof(x)==2) {...}
else if (sizeof(x)==4) {...}
else {...}
编译器将在编译时进行优化...