我对静态整数常量有一个奇怪的行为:
#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/