c++ - 对静态常量整数类型的 undefined reference

标签 c++

我对静态整数常量有一个奇怪的行为:

#include <iostream>
#include <inttypes.h>

class Test{
public:
 static const uint32_t Magic = 0x1123;
};

class DataStream{
public:
    template<typename T>
    DataStream& operator <<( const T& value )
    {
        std::cout << value << std::endl;
        return *this;
    }
};

int main()
{
    DataStream s;

    uint32_t a = Test::Magic;  // ok
    bool compare = ( a == Test::Magic ); // ok
    s << compare;
    s << a;
    s << Test::Magic;  // fail

    return 0;
}

我知道这些常量应该在 .cpp 类之外定义为

const uint32_t Test::Magic;

但奇怪的是,上面的代码在 s << Test::Magic; 行下工作正常并且仅在 Magic 时产生错误与模板一起使用 operator <<直接。

更多错误 undefined reference to 'Test::Magic'GCC 一起出现, 但不是 MSVC .

问题是为什么我要定义Test::Magic在类之外(即使没有值(value)!!!),为什么我的代码在某些情况下即使没有这样的定义也能正常工作?

最佳答案

作为规则,所有静态常量名称如果是ODR used 就应该在.cpp 文件中定义。 .引用参数是 ODR using 它们。但是,违反此规则是未定义的行为,MSVC 不报告错误只是未定义行为的一种表现方式。

作为实际考虑,当函数未内联时您可能会遇到错误,并且对于内联函数可能看不到它。我的猜测是内联的工作方式与您为这些编译器使用的优化级别不同。

关于c++ - 对静态常量整数类型的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719407/

相关文章:

c++ - C++中的异步函数调用

c++ - 在目录中获取目录中的文件列表

c++ - std::stringstream 奇怪的行为

c++ - 字符串以某个字符串开头

c++ - C++中的ifstream

c++ - 在 C++ 中给出指针常量 View 的更好方法

c++ - 如何在 gtk 3.0 中构建示例项目

c++ - Gtkmm3 TreeView ListStore.Clear 或 TreeSelection.unselectAll 导致错误

C++接口(interface)设计——IO板底层协议(protocol)

c++ - C++运算符重载编译错误