0

最近、構造体/クラス内の静的定数の奇妙な未定義のシンボルで説明されている問題に遭遇しました。静的constクラスのメンバーだけでなく、すべての静的constクラスメンバーの対応する.cppファイルに定義を追加して、コードを準拠させようとしています。リンカエラーを引き起こしていたもの。

定数が複数のコンパイルユニットで使用されている場合、定義がコンパイルユニットの1つだけにあるにもかかわらず、複数の定義エラーが発生します。

イニシャライザーを定義に移動することでエラーを防ぐことができますが、私はそうしません。

私が現在VisualStudioで作業している間、このコードはいくつかのプラットフォームでビルドする必要があります。

4

4 に答える 4

3

静的メンバー変数はクラス本体で宣言され、クラス本体の外で一度定義されます。これを行う一般的な方法は次のとおりです。

class MyClass

{
    static int i;

};

int MyClass::i = 0;

定義は、header(.h)ではなく、C++ソースファイルで行われます。そうすると、変数はインクルードされているヘッダーファイルのどこにでも定義されます。これとまったく同じ問題に直面しているようです。

于 2011-05-05T15:14:31.663 に答える
1

http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studioの投稿の1つによると、これは実際にはVisual Studioのバグである可能性があり、その形式の初期化を使用できません。

残念ながら、移植性を維持するためにソースファイルで初期化を行うのに行き詰まっている可能性があると思います。

g++4.2で正常にコンパイルおよびリンクされた簡単な例を作成しました。

于 2011-05-05T15:19:53.140 に答える
1

言語拡張機能を有効にしている場合、Visual Studioでは、実装ファイルでを定義せずに静的constオブジェクトを使用できます。残念ながら、明示的な定義がある場合、正しいC ++プログラムに対してエラーが発生します(私が正しく覚えている場合)。

言語拡張機能を無効にしてみてください。

于 2011-05-05T15:20:30.560 に答える
0

コードを複数のプラットフォームで動作させたい場合は、初期化を定義(.cppファイル内)に移動する必要があると思います。それ以外の場合は1つ以上のコンパイラで動作する可能性がありますが、移植性があるとは限りません。

于 2011-05-05T15:05:41.337 に答える