我有这个:
#if sizeof(int)
#error Can't use sizeof in a #if
#endif
我收到此编译器错误:
missing binary operator before token "("
为什么我不能在这里使用sizeof运算符?
答案 0 :(得分:12)
因为sizeof()是在预处理器运行后计算的,所以#if
无法获得该信息。
C编译器在逻辑上分为两个阶段,即使大多数现代编译器没有将它们分开。首先,对源进行预处理。这包括计算并替换所有预处理器条件(#if,#define,用替换替换定义的单词)。然后将源传递,处理到编译器本身。预处理器只是最不了解C的结构,它没有类型知识,所以它不能处理像sizeof()这样的编译器级结构。
答案 1 :(得分:2)
因为您只能在预处理程序指令中使用文字常量。此外,sizeof(int)总是大于0,所以我相信这个#if无论如何都会是真的。
答案 2 :(得分:-3)
考虑:
#if sizeof(MyClass) > 3
#define MY_CONSTRAINT 2
#endif
class MyClass
{
#if MY_CONSTRAINT == 3
int myMember = 3;
#endif
};
现在,这是用正确的语法编写的,因为自上次我做C ++以来已经有一段时间了,但重点仍然是:)
答案 3 :(得分:-3)
只需使用普通的if-else
if (sizeof(x)==2) {...}
else if (sizeof(x)==4) {...}
else {...}
并且编译器将在编译时优化它...