代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

为什么我不能在#if中使用sizeof()[[副本]

  •  10
  • Robert Deml  · 技术社区  · 16 年前

    我有这个:

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

    我遇到以下编译器错误:

    missing binary operator before token "("
    

    4 回复  |  直到 10 年前
        1
  •  12
  •   Andrew Aylett    16 年前

    因为sizeof()是在预处理器运行后计算的,所以该信息对于 #if .

    C编译器在逻辑上分为两个阶段,即使大多数现代编译器没有将它们分开。首先,对源代码进行预处理。这涉及到计算并替换所有预处理器条件(#if、#define,用替换词替换已定义的词)。然后将源代码传递、处理到编译器本身。预处理器对C的结构只有最低限度的了解,它没有类型知识,因此无法处理类似sizeof()的编译器级构造。

        2
  •  1
  •   Nick    16 年前

    因为您只能在预处理器指令中使用文字常量。此外,sizeof(int)总是大于0,所以我相信这个#if无论如何都是真的。

        3
  •  -3
  •   cwap    16 年前

    考虑:

    #if sizeof(MyClass) > 3
       #define MY_CONSTRAINT 2
    #endif
    
    class MyClass
    {
       #if MY_CONSTRAINT == 3
          int myMember = 3;
       #endif
    };
    

    现在,这是不正确的语法,因为我已经做了一段时间以来,我做了C++,但点仍然代表:

        4
  •  -3
  •   demiurg_spb    13 年前

    如果不是,就用普通的

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