ホームページ > バックエンド開発 > C++ > ヘッダー ファイルで「複数定義」エラーが発生するのはなぜですか? それらを修正するにはどうすればよいですか?

ヘッダー ファイルで「複数定義」エラーが発生するのはなぜですか? それらを修正するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-27 06:31:14
オリジナル
162 人が閲覧しました

Why Do I Get

ヘッダー ファイルの複数の定義エラー: その原因と解決方法

複数のヘッダー ファイルが提示された場合、コンパイラーで「複数の定義」エラーが発生します。同じプログラム内のシンボルの定義。これは、複数のソース ファイルに同じヘッダー ファイルが含まれており、それぞれが同じシンボルを定義している場合に発生する可能性があります。

提供されたコード サンプルを調べてみましょう。

// complex.h
#include <iostream>

class Complex {
public:
   Complex(float Real, float Imaginary);
   float real() const { return m_Real; };
private:
   friend std::ostream&amp; operator<< (std::ostream&, const Complex&);
   float m_Real;
   float m_Imaginary;
};

std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
ログイン後にコピー

演算子<<関数は .h ファイルで定義されており、複数のソース ファイルに関数がインクルードされるため、複数定義の候補になります。

// complex.cpp
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
ログイン後にコピー
// main.cpp
#include "complex.h"
#include <iostream>
int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
ログイン後にコピー

このコードをコンパイルすると、コンパイラで「複数定義」エラーが発生します。演算子用

real() ではない理由

real() メンバー関数は暗黙的にインライン化されます。つまり、コンパイラは、たとえそれがインラインで宣言されたかのようにそれを扱います。 .h では明示的に指定されていません。 file.

解決策

演算子の複数定義の問題を解決するには<<関数の場合、主に 2 つの代替案があります:

関数をインライン化します:
関数定義に inline キーワードを追加して、コンパイラにインライン化するように指示します:

inline std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
ログイン後にコピー

定義を .cpp ファイルに移動します:
関数を削除します.h ファイルから定義を取得し、対応する .cpp ファイルに配置します:

// complex.cpp
std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
ログイン後にコピー

その他のソリューション

追加のソリューションには次のものがあります:

  • プラグマ 1 回: .h ファイルでプリプロセッサ ディレクティブを使用して抑制する複数のインクルード。
  • モジュール システム: モジュール システム (C 20 以降) を使用してソース ファイル間の依存関係を処理します。
  • ヘッダー ガード:複数のインクルードを防ぐために、.h ファイルが一意のマクロを定義していることを確認します。

以上がヘッダー ファイルで「複数定義」エラーが発生するのはなぜですか? それらを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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