【问题标题】:Why can't I use sizeof in a preprocessor condition?为什么我不能在预处理条件下使用 sizeof?
【发布时间】:2009-10-23 09:26:57
【问题描述】:

我知道 sizeof 是一个运算符,它在编译时被评估为一个整数常量。 但它似乎不能在 #if 预处理器指令中使用,例如:

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

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

为什么不允许这样使用?

【问题讨论】:

    标签: c c-preprocessor sizeof


    【解决方案1】:

    因为sizeof是在编译时评估的,而指令是在编译之前评估的,而这样做的部分不是编译器,所以它不会理解sizeof的含义。

    【讨论】:

    • 实际上预处理发生在编译期间,只是在早期阶段之一。评估sizeof 发生在稍后阶段。
    • @sbi 预处理不是编译的一部分 - 编译器通常在实际编译之前运行预处理器,但您可以指示编译器不要这样做。 RichN 的答案是 100% 正确的。
    • 好吧,我错了,但只是在术语上:这是翻译的阶段之一。根据这个stackoverflow.com/questions/1476892/1479972#1479972,也没有称为“编译”的阶段,所以这意味着什么似乎可以解释。
    • 我可以发誓我以前见过它工作。也许我错了。
    【解决方案2】:

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

    【讨论】:

    • "==" 也是一个运算符。 RichN 的回答对我来说问题更清楚了。
    • @felix0322:预处理器有自己的== 操作符,这是预处理器指令中使用的操作符。
    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2011-06-04
    • 2013-07-13
    • 2010-12-04
    相关资源
    最近更新 更多