= NULL,在 c++98 中初始化非静态数据成员
= NULL, and non-static data member initializing in c++98
之前:
在 C++98, C++03 中 - 不存在非静态数据成员初始化器 (NSDMI)。
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
零问题是为什么 0 != NULL 这里(我以为
#define NULL 0, or
#define NULL (void *)0' )
GCC 禁止显示有关系统标头中无效代码的某些警告,例如在 C++98 代码中使用 C++11 功能。由于NULL
是系统标头中定义的宏,因此GCC感到困惑并认为无效代码位于系统标头中,因此此处不会发出警告。当您使用0
时,它会发出警告,因为它不会混淆位置。
注:注:(void*)0
不是 C++ 中NULL
的有效定义,因为这意味着这不会编译:
int* p = NULL;
在 C 中,您可以将void*
转换为int*
,但不能在 C++ 中转换。
主要问题是为什么在较新的 gcc 版本中,我们可以初始化:
void *x = NULL;
没有任何警告 - 而这个指针是非静态的,默认情况下它不设置为NULL
(默认情况下void *x;
未初始化)。
这是一个错误,GCC 应该对此代码进行诊断。
我的另一个问题是如何强制旧的 gcc 版本接受它,
GCC 4.7 将接受它并发出警告。你不能让旧版本接受它(即使有-std=c++0x
),因为直到 4.7 才添加对默认成员初始值设定项的支持
或者是否有任何技巧可以使非静态指针成员默认初始化为 NULL。
定义构造函数并在其中设置成员。
实际上,非静态数据成员的默认成员初始值设定项在 C++98/C++03 中是不允许的,并且仅在 C++11 中出现。
struct test {
void *x = NULL;
};
仅由于已知的错误而被 GCC 接受 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103347 这在 GCC 12 中已修复。
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- "local scope"中的 C++ 初始化静态变量
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- 如何从静态类函数初始化静态类对象
- C++:用IIFE线程初始化静态局部变量安全吗
- 如何在 c++ 中初始化静态类对象?
- 使用 lambda 初始化静态数组
- 使用 lambda 函数初始化静态数据成员
- 如何从 std::integer_sequence 初始化静态数组?
- 在构造函数中初始化静态函数指针
- C - 初始化静态成员的方法
- 大括号使用枚举类初始化静态常量unordered_map
- C++ main 函数中初始化静态变量
- 在定义(.cpp文件)中初始化静态浮点 constexpr 成员是可能的
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 如何在运行时使用静态成员函数初始化静态成员变量
- 与其他静态const成员初始化静态常量成员