为什么 LinuxGCC 允许类内初始化非常量静态成员,而 MinGW 不允许?

Why does LinuxGCC allow in-class initialization of non-const static member, but MinGW doesn't?

提问人:couscous 提问时间:10/21/2023 最后编辑:JaMiTcouscous 更新时间:10/22/2023 访问量:56

问:

我和一位朋友正在做一个学校项目,我们应该声明一个静态类成员,基本上是类对象的计数器,它为每个对象分配一个 ID。

我在 Ubuntu 上使用 Linux GCC,而我的朋友在 Windows 上使用 MinGW。我们都使用 Eclipse IDE。 Linux 机器使用 gcc 11.4.0。GCC C++ 编译器的方言在两台计算机上都设置为 ISO C++17。minGW 的 gcc 版本应该是 13.1.0(根据 中的某些文件)。minGW.zip

我的源代码如下。在我的 Linux 机器上运行它有效。尝试在 Windows 上运行它会返回错误:“ISO C++ 禁止类内初始化非常量静态成员 'Fahrzeug::p_iMaxID'”。为什么编译器之间存在差异,如何在不编写另外 10 行代码的情况下修复错误?(如果可能的话)。

Fahrzeug.h

#ifndef FAHRZEUG_H_
#define FAHRZEUG_H_

#include <iostream>
#include <string>

class Fahrzeug {
public:
    inline Fahrzeug(); //Default-Konstruktor
    inline Fahrzeug(std::string p_sName);
    inline ~Fahrzeug();
    std::string getName() {return p_sName;};
    int getID() {return p_iID;};

private:
     std::string p_sName = "";
     static inline int p_iMaxID = 1;
     const int p_iID = p_iMaxID++;

};

#endif /* FAHRZEUG_H_ */

Fahrzeug.cpp

#include "Fahrzeug.h"

/* Default Constructor*/
Fahrzeug::Fahrzeug() {std::cout << "Standard-Constructor. Name : " << this->p_sName << " ID: " << this->p_iID << std::endl;}

/* Default Destructor*/
Fahrzeug::~Fahrzeug() {std::cout << "Destructor. Name : " << this->p_sName << " ID: " << this->p_iID << std::endl;}

Fahrzeug::Fahrzeug(std::string p_sName) {
    this->p_sName = p_sName;
    {std::cout << "Construktor w/ name. Name : " << this->p_sName << " ID: " << this->p_iID << std::endl;}
}

C++ GCC 初始化 mingw static-members

评论

1赞 HolyBlackCat 10/21/2023
两台机器上的 GCC 版本是什么?什么是编译器标志?您的 MinGW 可能已过时和/或配置为使用旧的 C++ 标准。
0赞 couscous 10/21/2023
@HolyBlackCat Linux 计算机使用 gcc 11.4.0,则 GCC C++ 编译器的方言在两台计算机上都设置为 ISO C++17。我不知道编译器标志是什么。minGW 的 gcc 版本应该是 13.1.0(根据 minGW.zip 中的某个文件)。
0赞 HolyBlackCat 10/21/2023
尝试直接从终端在 Windows 上编译。也许您有多个 MinGW 安装。
1赞 user17732522 10/21/2023
@couscous 错误消息表明您正在尝试使用 GCC 6 或更早期的版本,它们不支持 C++17。较新版本的 GCC 不会给出该错误消息,而是暗示启用 C++17 以支持变量。inline
1赞 JaMiT 10/22/2023
“我的源代码在下面。”-- 这不是你的完整源代码,这比这个网站上的许多问题要好,但它仍然超出了必要的范围。错误是编译时,因此不需要输出语句。如果您将类减少到class Fahrzeug { static inline int p_iMaxID = 1; };

答: 暂无答案