考虑以下代码,您认为结果如何?你期望结果是什么?
#include <stdio.h>
#if AAAA == BBBB
#define STRING "foo"
#else
#define STRING "bar"
#endif
int main() {
printf("%s\n", STRING);
return 0;
}
构建和测试:
~/test$ gcc -Wall test.c
~/test$ ./a.out
foo
我知道它在技术上是正确的,因为AAAA和BBBB都是&#34; UNDEFINED&#34;,并且由开发人员确保在使用之前检查两个宏是否已定义,但我真的当我指定-Wall 时,期望gcc可以发出警告。但它没有。
这确实是一个问题,这是有道理的。如果您使用 __ BIG_ENDIAN 和 __ BYTE_ORDER 这样的宏来决定程序应该使用的字节,那么这可能是一个非常有问题的问题。
例如,我发现这种代码存在于AOSP的SKIA库中:
#if __BYTE_ORDER == __BIG_ENDIAN
#define SK_CPU_BENDIAN
#undef SK_CPU_LENDIAN
#else
#define SK_CPU_LENDIAN
#undef SK_CPU_BENDIAN
#endif
如果你试图从这个库中移植一些代码片段并且未能包含正确的标题(在这种情况下是endian.h),你就搞砸了......