ホームページ > バックエンド開発 > C++ > C に .h ファイルの代わりに .cpp ファイルを含めるとエラーが発生するのはなぜですか?

C に .h ファイルの代わりに .cpp ファイルを含めるとエラーが発生するのはなぜですか?

DDD
リリース: 2024-12-04 10:01:11
オリジナル
246 人が閲覧しました

Why does including a .cpp file instead of a .h file in C   lead to errors?

ヘッダー ファイルのインクルードとソース コードの比較

C プログラムで複数のソース ファイルを扱う場合、ヘッダー ファイルのインクルードとソース コードの違いを理解することが重要ですファイル (.h) とソース コード ファイル (.cpp)。

この例では、インクルード時にエラーが発生しました。 main.cpp ファイル内の「foop.h」の代わりに「foop.cpp」。これは、ヘッダー ファイルが関数のプロトタイプやその他の必要な情報を宣言するために特別に設計されているのに対し、ソース コード ファイルには実際の関数実装が含まれているためです。

ヘッダー ファイルをインクルード

ヘッダーをインクルードするファイルを使用すると、コンパイラは、定義を重複させることなく、他のソース コード ファイルで定義された関数を見つけて認識できるようになります。 「foop.h」をインクルードすることにより、main.cpp ファイルは foo() 関数プロトタイプにアクセスできるようになり、完全な実装の詳細を知らなくてもプログラムがプロトタイプを呼び出すことができるようになります。

ソース コード ファイルを含む

対照的に、「foop.cpp」を直接インクルードすると、そのファイルのすべてのコードが main.cpp ファイルにコピーされ、多重定義エラーが発生します。 foo() は foop.cpp と main.cpp の両方で定義されているため、コンパイラはどちらの定義を使用するか混乱します。

仕組み

ヘッダー ファイルを作成すると、その内容が現在のソース コード ファイルに効果的にコピーされます。たとえば、「foop.h」を含めると、main.cpp に次の同等のコードが作成されます:

// Header file contents

int foo(int a);

int main(int argc, char *argv[]) {
  // Rest of the main.cpp code
}
ログイン後にコピー

ただし、「foop.cpp」を含めると次のようになります:

// Source code file contents

int foo(int a){
    return ++a;
}

int main(int argc, char *argv[]) {
  // Rest of the main.cpp code
}
ログイン後にコピー

結果

ソース コード ファイルを直接インクルードすると、次のような予期せぬ結果が生じる可能性があります。 as:

  • 名前空間の汚染: foop.cpp で定義された関数と変数はメインの名前空間の一部となり、他のグローバル シンボルと競合する可能性があります。
  • コンパイル時間の増加: 大規模なソースが含まれるコード ファイルを使用すると、コンパイル プロセスが遅くなる可能性があります。
  • エラーが発生しやすい: ソース コード ファイルを手動でインクルードすることは、ヘッダーを使用するよりも信頼性が低くなります。ファイルはコンパイラによって自動的に生成されます。

ベスト プラクティス

したがって、ファイルを参照するときは、ヘッダー ファイル (.h) をインクルードすることを常に推奨します。関数と宣言を分離し、ソース コードの実装を別のファイル (.cpp) に保持します。これにより、コードのモジュール性が確保され、エラーが回避され、コードの可読性が向上します。

以上がC に .h ファイルの代わりに .cpp ファイルを含めるとエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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