2009-10-23 48 views
13

我明白sizeof是一个运算符,它在编译时被评估为一个整数常量。 但它似乎不能像在#if预处理指令可以使用:为什么我不能在预处理器条件中使用sizeof?

#if 4 == sizeof(int) 
    typedef int Int32; 
#endif 

(cygwin的-GCC 3.4.4以及Visual C++ 6.0编译报告错误)

为什么是这样的用法不允许?

回答

19

因为sizeof是在编译时进行评估,同时指令被评估以前编译,这确实不是编译器的一部分,所以它不会明白什么sizeof手段。

+1

实际上,预处理发生在编译过程中,只是在其中一个早期阶段。评估'sizeof'发生在以后的阶段。 – sbi 2009-10-23 11:14:49

+4

@sbi预处理不是编译的一部分 - 编译器通常在实际编译之前运行预处理器,但您可以指示编译器不要这样做。 RichN的答案是100%正确的。 – qrdl 2009-10-23 12:43:49

+0

嗯,我错了,但只是在术语中:这是_translation_的一个阶段。根据这个http://stackoverflow.com/questions/1476892/1479972#1479972,也没有阶段称为“编译”,所以这意味着什么似乎可以解释。 – sbi 2009-10-23 21:34:51

10

sizeof是一个C运算符。您不能在预处理器指令中使用C代码。预编译指令在编译前进行评估。

+0

你得到他们的第一个! – 2009-10-23 10:05:49

+0

“==”也是一个运算符。 RichN的回答指出这个问题对我来说更清楚些。 – felix0322 2009-10-23 10:52:33

+2

@ felix0322:预处理器有自己的'=='操作符,这是在预处理器指令中使用的操作符。 – sbi 2009-10-23 11:15:21

相关问题