0

私の知る限り、すべての整数型はヘッダー ファイルで初期化できます。そのため、ヘッダーの 1 つでこの種の宣言が正しいと感じました (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 に答える