ホームページ > バックエンド開発 > C++ > C でヘッダー ファイルで関数を定義すると「複数定義」エラーが発生するのはなぜですか?

C でヘッダー ファイルで関数を定義すると「複数定義」エラーが発生するのはなぜですか?

Linda Hamilton
リリース: 2024-11-19 07:00:03
オリジナル
993 人が閲覧しました

Why Does Defining a Function in a Header File Cause a

なぜヘッダーにシンボルが複数定義されているのですか?

複数のヘッダー ファイルを使用して C プログラムをコンパイルしようとすると、「[シンボルの複数の定義」というエラーが発生する可能性があります。 ]。」このエラーは、コード内で同じシンボル (関数や変数など) が複数回定義されている場合に発生します。

次の例を考えてみましょう:

// complex.h
#ifndef COMPLEX_H
#define 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&amp; o, const Complex&amp; Cplx);

   float m_Real;
   float m_Imaginary;
};
#endif // COMPLEX_H

// complex.cpp
#include "complex.h"

Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
ログイン後にコピー
// operator.cpp
#include "complex.h"

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

int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
ログイン後にコピー

このコードをコンパイルすると、前述のエラーが発生します。この問題は演算子<<の定義から発生します。関数はoperator.cppにあります。ヘッダー ファイルには関数の宣言が含まれていますが、operator.cpp 内の定義はインライン展開されません。その結果、コンパイラは関数の 2 つの別々の定義を生成し、多重定義エラーが発生します。

暗黙的にインライン展開される real() のようなパブリック メンバー関数とは異なり、operator

このエラーを解決するには、次のいずれかを実行できます。

  • 演算子をインライン化<<ヘッダー ファイルの関数定義:
// complex.h
...
inline std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
ログイン後にコピー
  • 演算子を移動<<定義を実装ファイルに追加します:
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
ログイン後にコピー

関数をインライン化するか、その定義を実装ファイルに配置することにより、複数定義エラーを回避でき、プログラムが正常にコンパイルされるようになります。

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

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