为什么clang将NULL定义为__NULL
Why is clang defining NULL as __null?
我有一个.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
是什么。
相关文章:
- 奇怪的结构&GCC&clang(void*返回类型)
- 数据成员SFINAE的C++17测试:gcc vs clang
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 如何在 c++ 中'NULL'字符串
- Clang bug?使用指针作为模板参数
- c++使用foreach使数组为null
- clang整洁10忽略了我的NOLINT命令
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 当使用通配符和null指针调用函数时,对输出的说明
- 在clang++预处理器中确定gcc工具链版本
- 为什么 Clang 不允许"and"作为函数名称?
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- clang格式:宏的缩进
- CLANG 编译器 说:变量"PTR"可能未初始化
- 为什么clang将NULL定义为__NULL
- if(null) 正在使用 clang++ 编译的特定计算机中执行
- clang++ 4.1,在解引用NULL时没有崩溃