0

据我所知,所有整数类型都可以在头文件中初始化。这就是为什么我觉得这种声明在我的一个标题中是正确的(我们称之为 foo.h):

class Foo {
public:
  static const unsigned int DEFAULT = 0xffffffff;
  ...
};

在发布模式下编译和链接时,它起作用了。但是,当我在调试模式下编译代码时,出现以下错误:

undefined reference to `Bar::Foo::DEFAULT'
collect2: ld returned 1 exit status

当我将初始化移动到 foo.cpp 时,问题就解决了:

const unsigned int Foo::DEFAULT = 0xffffffff;

但我不明白为什么。有人能猜到吗?

(我在 Ubuntu 上使用 gcc 4.2.4)

4

1 回答 1

0

您已经初始化了成员,但没有定义它。您仍然需要const unsigned int Foo::DEFAULT;在单个实现文件中。

在发布版本中,对成员的引用可能已被优化掉(即用值替换为内联值,因为您告诉编译器它不会被更改),因此不会查找任何符号。调试不是那么宽松 - 编译器现在想知道您的成员已定义并驻留在内存中的某个位置。

于 2013-04-10T09:24:14.210 回答