ホームページ > バックエンド開発 > C++ > C クラスで静的 constexpr char 配列を使用すると「未定義の参照」エラーが発生するのはなぜですか?

C クラスで静的 constexpr char 配列を使用すると「未定義の参照」エラーが発生するのはなぜですか?

Susan Sarandon
リリース: 2024-12-19 14:13:10
オリジナル
770 人が閲覧しました

Why Do I Get an

静的 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート