为什么我不能在#if中使用sizeof()?

时间:2010-02-23 15:52:05

标签: c c-preprocessor sizeof

我有这个:

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

我收到此编译器错误:

missing binary operator before token "("

为什么我不能在这里使用sizeof运算符?

4 个答案:

答案 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                    {...}

并且编译器将在编译时优化它...