为什么两个未定义的宏在GCC中被认为是相同的而没有警告?

时间:2014-12-25 04:50:37

标签: android c++ c macros android-source

考虑以下代码,您认为结果如何?你期望结果是什么?

#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),你就搞砸了......

0 个答案:

没有答案