静的 constexpr char[]
への未定義の参照 C で、クラス内で静的な const char 配列を宣言し、それをクラス内で使用する場合メンバー関数を使用すると、未定義の参照を示すエラーが発生する可能性があります。このエラーは、静的メンバーの宣言と定義が分離されているために発生します。
問題
次の例を考えてみましょう。
// header file (foo.hpp) struct Foo { void bar(); static constexpr char baz[] = "qux"; }; // cpp file (foo.cpp) void Foo::bar() { std::string str(baz); // undefined reference to baz }
この例ではたとえば、静的 const char 配列 baz はクラス内で宣言されていますが、定義されていません。 GCC でコードをコンパイルすると、「baz への未定義の参照」というエラーが発生します。
解決策
この問題を解決するには、静的オブジェクトの定義を提供する必要があります。 cpp ファイル内のメンバー。この定義は、配列の実際の内容を指定します。上記の例では、次の行を cpp ファイルに追加します。
constexpr char Foo::baz[];
説明
C では、静的メンバーには宣言と定義の両方が必要です。は別個の存在です。宣言はメンバーの型と名前を指定し、定義はその実際の実装または値を提供します。
クラス内で宣言された静的メンバーの場合、宣言は通常、初期化子とともにクラス定義に表示されます。ただし、定義はクラス定義の外側で (通常は別の cpp ファイルかクラス定義の最後で) 提供する必要があります。
静的メンバー baz の定義を提供することで、リンカーは解決できるようになります。その参照を取得し、必要なコードを生成します。定義がないと、リンカーは配列の実際の内容を判断できず、未定義の参照エラーが発生します。
以上がC クラスで静的 constexpr char 配列を使用すると「未定義の参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。