【问题标题】:= NULL, and non-static data member initializing in c++98= NULL,以及在 c++98 中初始化的非静态数据成员
【发布时间】: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 错误。

标签: c++ gcc c++03 c++98


【解决方案1】:

零问题是为什么 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。

定义一个构造函数并在那里设置成员。

【讨论】:

    【解决方案2】:

    确实,非静态数据成员的默认成员初始化器在 C++98/C++03 中是不允许的,并且只出现在 C++11 中。

    struct test {
        void *x = NULL;
    };
    

    仅由于已知错误https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103347 而被 GCC 接受 这是在 GCC 12 中修复的。

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多