C コードで「複数定義」エラーがスローされるのはなぜですか?

Linda Hamilton
リリース: 2024-11-20 04:32:02
オリジナル
435 人が閲覧しました

Why Does My C   Code Throw a “Multiple Definition” Error?

複数定義エラー: 競合する定義の解決策

C では、ヘッダーで関数またはクラスを定義し、ソース ファイルに実装するときに、開発者は「複数の定義」というエラーが発生する可能性があります。このエラーは、複数の翻訳単位 (ソース ファイル) に同じ識別子の定義が含まれている場合に発生します。

複数の定義の原因

ヘッダー ファイルの場合、「複数の定義」エラーが発生します定義を含むものは複数の翻訳単位に含まれます。これは、次の場合に発生する可能性があります。

  • ヘッダー ファイルがソース ファイルとそれに対応するヘッダー ファイルの両方に含まれている。
  • 宣言の代わりにヘッダー ファイルに定義が提供されている。

エラーを理解する

コードサンプルを検討する提供:

// complex.h
class Complex
{
public:
   friend std::ostream& operator<<(std::ostream&, const Complex&);
};

// complex.cpp
std::ostream& operator<<(std::ostream&, const Complex&);
ログイン後にコピー

この例では、演算子 << の定義は次のようになります。は、complex.cpp ではなく complex.h にあります。 main.cpp と complex.cpp の両方が << を定義しようとするため、これにより複数定義エラーが発生する可能性があります。 Complex クラスの演算子。

複数の定義に対する解決策

複数の定義エラーの解決策は次のとおりです。

  • 使用「inline」キーワード: 関数をインラインとして宣言すると、複数の翻訳単位で定義を提供できるようになります。衝突を引き起こすことなく。ただし、インライン関数には、大規模な関数のパフォーマンスへの影響など、いくつかの制限があります。
  • 定義をソース ファイルに移動: 演算子 << を定義する代わりに、ヘッダー ファイル内で、それを対応するソース ファイル (complex.cpp) に移動します。これにより、定義が 1 つの翻訳単位にのみ存在することが保証されます。

複数定義エラーを回避するには、inline キーワードを使用するか、定義をソース ファイルに移動することをお勧めします。

real() と <

の処理の違い コードサンプルでは、​​real() 関数complex.h で宣言されていますが、定義されていません。これが、コンパイラが複数定義エラーを報告しない理由です。クラス宣言で宣言されたメンバー関数は暗黙的にインライン化されます。つまり、その定義はヘッダーを含むすべての変換単位に挿入されます。これは演算子 << には当てはまりません。 complex.h.

で定義されている関数

以上がC コードで「複数定義」エラーがスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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