【发布时间】:2018-09-12 02:37:39
【问题描述】:
首先:
在 C++98 中,C++03 - 非静态数据成员初始化器 (NSDMIs) 不存在。
https://wandbox.org/ - 在线编译器,您可以更改 gcc 版本等。
好的,现在让我们考虑一些代码(在 c++98 或 c++03 中):
#include <iostream>
struct test {
void *x = NULL;
void *y = 0; //with (void*)0 here, we get the same results
};
int main() {
std::cout<<(int)NULL;
}
从 gcc 4.8.1 开始:
void *x = NULL;
是允许的(出乎意料的),但是
void *y = 0;
不是(如预期的那样)。 // 收到“non-static data member initializers only available with -std=c++11 or -std=gnu++11”警告
零问题是为什么 0 != NULL 这里(我认为#define NULL 0,
要么
#define NULL (void *)0)
主要问题是为什么在较新的 gcc 版本中,我们可以初始化:
void *x = NULL; 没有任何警告 - 而这个指针是非静态的,默认情况下它没有设置为 NULL(默认情况下 void *x; 未初始化)。
我的另一个问题是如何强制旧的 gcc 版本接受它,或者是否有任何技巧可以使非静态指针成员默认初始化为 NULL。
我正在使用:
$ g++ prog.cc -Wall -Wextra -O2 -march=native -std=c++98 -pedantic-errors
【问题讨论】:
-
我不希望 = NULL 允许,我希望 = 0 不允许。编译器标志在我问题的最后一行。
-
糟糕,错过了标记。需要更多的睡眠。 :|
-
确实很奇怪,即使
-pedantic-errors也没有阻止它编译。 Clang 拒绝两者,所以我闻到了 GCC 错误。 -
在 c++11 之前这些都不应该被允许
-
更奇怪的是:当只是预处理(使用
-E)时,您会看到NULL实际上扩展为__null,但即使使用__null而不是0,您的代码也会失败,而NULL有效。但正如@HolyBlackCat 所说,这可能是一个 GCC 错误。