这让我感到困惑:如果我注释掉从 #if 到 #endif 的所有内容,程序将在 C99 (TinyCC) 中编译。在它的条件下,在#if 子句之前的行中给出了预期的错误“)”(得到“0”)
#include <stdio.h>
#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})
#if IS_BIG_ENDIAN
struct ieee {
unsigned long sign:1;
unsigned long expo:8;
unsigned long mantissa:23;
};
#else
struct ieee {
unsigned long mantissa:23;
unsigned long expo:8;
unsigned long sign:1;
};
#endif
int main()
{
printf ("%d\n",IS_BIG_ENDIAN);
}
预处理器通常不知道如何计算所有 C 表达式。它的能力相当有限。
如果用 注释掉 if 行#if
,则不会评估宏。这就是为什么您不会收到错误消息。
但是如果宏被评估,你会让预处理器解析表达式。显然它不能这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句