为什么clang将NULL定义为__NULL

Why is clang defining NULL as __null?

本文关键字:NULL clang 定义 为什么      更新时间:2023-10-16

我有一个.cpp文件,它在多个地方使用了NULL。当我试图在Windows机器+独立工具链上使用clang++为Android/x86平台编译这个cpp文件时,我在使用NULL的地方遇到了"预期表达式"错误。我在AndroidNDK提供的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(?还是我在这里错过了什么?

有人能帮我理解吗。感谢

为什么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++似乎知道__null是什么。