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

12

我有这个:

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

我遇到了这个编译器错误:

missing binary operator before token "("

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


2
这个问题已经被问了很多次。只需搜索一下即可找到答案。例如,这里有一个答案:https://dev59.com/ZUrSa4cB1Zd3GeqPU0Ny - AnT stands with Russia
我认为你正在寻找LISP或Scheme :) - leppie
4个回答

12

由于sizeof()是在预处理器运行之后计算的,因此信息对于#if不可用。

C编译器在逻辑上分为两个阶段,即使大多数现代编译器不会将它们分开。首先,源代码被预处理。这涉及计算和替换所有预处理条件(如#if、#define,用其替换定义单词)。然后将经过预处理的源代码传递到编译器本身进行处理。预处理器只能最小程度地了解C的结构,它没有类型知识,因此无法处理像sizeof()这样的编译器级别构造。


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

那是我举的一个不好的例子。我试图剥离掉所有与我的项目相关的细节,然后想出了这个例子。 - Robert Deml
2
不是完全准确的:您可以执行布尔运算,并且存在一些类似于函数调用的调用(defined())。一些预处理器允许大量的额外内容(我曾见过人们要求预处理器中拥有日志运算符,因为他们已经在嵌入式编译器中使用了它们)。 - Andrew Aylett

-3

考虑:

#if sizeof(MyClass) > 3
   #define MY_CONSTRAINT 2
#endif

class MyClass
{
   #if MY_CONSTRAINT == 3
      int myMember = 3;
   #endif
};

现在,这可能不是正确的语法,因为我已经有一段时间没有写C++了,但重点仍然存在 :)


2
回顾过去,我真的不知道 :) - cwap
哈哈,我很欣赏你的诚实 :P 很高兴你没有把我的评论解释为敌意。 - Ponkadoodle

-3

只需使用普通的if-else语句

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

编译器将在编译时进行优化...


整个重点在于编译时声明。 - vitiral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接