为什么clang将NULL定义为__null?

我有一个.cpp文件,该文件在多个地方的使用情况 NULL 。当我尝试在Windows计算机+独立工具链上使用clang ++编译适用于Android / x86平台的cpp文件时,在使用 NULL 的地方遇到“预期表达式”错误。我在Android NDK提供的clang标头的stddef.h中找到 NULL 的定义。

#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
#  if !defined(__MINGW32__) && !defined(_MSC_VER)
#    define NULL __null
#  else
#    define NULL 0
#  endif
#else
#  define NULL ((void*)0)
#endif

据我所知,__null特定于GNU编译器。在我的情况下,_MSC_VER和__MINGW32__均未定义,因为我正在使用clang ++和独立工具链针对Android平台进行编译。因此它进入了define NULL __null。由于clang ++不知道__null是什么,因此会导致“预期表达式”错误。

我的问题是,为什么clang使用GNU编译器提供的宏(例如__null)?还是我在这里想念东西?

请有人帮我理解。谢谢

hushikai123 回答:为什么clang将NULL定义为__null?

  

为什么clang将NULL定义为__null?

__null优于0,因为前者只是一个空指针常量,而后者也是一个整数常量。在重载解析和类型推导的情况下,这种差异非常重要:

void foo(int);
void foo(void*);

foo(0);       // calls foo(int)
foo(__null);  // call is ambiguous,program is ill-formed
foo(NULL);    // could have either behaviour
              //  call to foo(int) would be undesirable
foo(nullptr); // calls foo(void*)

原因与nullptr被引入C ++ 11语言的原因相同或相似。

这样做的另一个原因是clang努力与GCC紧密兼容。

  

因为clang ++不知道__null是什么

用clang ++ appears知道__null是什么。

本文链接:https://www.f2er.com/3164964.html

大家都在问