2010-02-23 121 views
10

我有这样的:为什么我不能在#if中使用sizeof()?

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

我得到这个编译器错误:

missing binary operator before token "(" 

为什么我不能在这里使用sizeof操作符?

+2

这具有b个een多次问道。只要做一个搜索。这里有一个答案,例如,http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-sizeof-comparison-in-preprocessor-if – AnT 2010-02-23 15:54:30

+0

我认为你正在寻找LISP或计划:) – leppie 2010-02-23 15:55:56

回答

12

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

即使大多数现代编译器没有将它们分开,C编译器在逻辑上也分为两个阶段。首先,来源是预处理的。这包括制定并替换所有预处理条件(#if,#define,用替换替换定义的词)。源然后被传递,处理到编译器本身。预处理器只是最小程度地意识到C的结构,它没有类型知识,所以它不能处理像sizeof()这样的编译器级结构。

2

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

+0

这是我的一个不好的例子。我试图剥离我的所有项目特定细节,并提出这个例子。 – Robert 2010-02-23 15:56:18

+1

不完全正确:您可以执行布尔操作,并且有一些函数式调用('defined()')。一些预处理器允许额外的东西流量负载(我看到人们在预处理器中请求日志操作符,因为他们已经使用了嵌入式编译器)。 – 2010-02-23 16:01:01

0

#if是一个预处理指令。
sizeof()是一个C运算符,并在编译时计算。

在预处理器(处理#if时)时,C运算符不执行。

+0

'sizeof'不是一个库函数,它是一个运算符。 – avakar 2010-02-23 15:57:13

+0

不完全正确:sizeof()是一种语言功能,而不是库函数。除了一些特定于C99的魔法外,它在编译时进行评估。 – 2010-02-23 15:58:03

+0

感谢您对sizeof作为操作符的评论....修正了我的答案。 – 2010-02-23 15:59:42

-3

考虑:

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

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

现在,这是prolly不是写在正确的语法,因为它一直以来,我最后一次做C++一段时间,但问题依然存在:)

+0

你指的是什么? – Ponkadoodle 2013-08-28 22:13:27

+2

回想起来,我真的不知道:) – cwap 2013-08-29 06:42:16

+0

哈哈,我很欣赏诚实:P很高兴你没有把我的评论解释为敌对。 – Ponkadoodle 2013-08-29 07:21:40

-3

只是使用普通的if-else

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

和编译器将优化它在编译的时候......

+0

整点是编译时的声明。 – vitiral 2015-05-01 15:55:35