ホームページ > バックエンド開発 > C++ > .h ファイルではなく .cpp ファイルを含めることを避けるべき理由は何ですか?

.h ファイルではなく .cpp ファイルを含めることを避けるべき理由は何ですか?

Barbara Streisand
リリース: 2024-11-27 19:20:11
オリジナル
931 人が閲覧しました

Why Should You Avoid Including .cpp Files Instead of .h Files?

.cpp ファイルを含める: 重複が発生しますか?

プログラミング コンテキストでは、ヘッダー ファイル (.h) とソース ファイル (.h) が使用されます。 cpp)は重要な役割を果たします。ヘッダー ファイルには関数とクラスの宣言が含まれており、他のモジュールがそれらと対話できるようになります。一般にヘッダー ファイルをインクルードすることが推奨されますが、代わりにソース ファイル (.cpp) を直接インクルードできますか?

答えは断然「ノー」です。 .cpp ファイルを含めると、複数の定義エラーが発生する可能性があります。その理由を理解するために、次のコードを調べてみましょう。

// main.cpp
#include <iostream>
#include "foop.h"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
ログイン後にコピー
// foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
ログイン後にコピー
// foop.cpp
int foo(int a) {
  return ++a;
}
ログイン後にコピー

ヘッダー ファイルがインクルードされていると、コードは問題なくコンパイルされ、実行されます。ただし、ヘッダー ファイルではなくソース ファイル (.cpp) を誤ってインクルードしたとします。

// main.cpp
#include <iostream>
#include "foop.cpp"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
ログイン後にコピー

このシナリオでは、コンパイラーはエラーをスローします。

multiple definition of foo(int)
first defined here
ログイン後にコピー

原因このエラーは?プリプロセッサにソース ファイル (.cpp) が含まれる場合、そのファイルの内容全体が現在のファイルにコピーされます。したがって、基本的に次のコードが生成されます。

// main.cpp
#include <iostream>

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

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
ログイン後にコピー

ご覧のとおり、関数 foo() が同じファイル内で 2 回定義されており、複数定義エラーが発生しています。この問題を回避するには、ソース ファイル (.cpp) の代わりにヘッダー ファイル (.h) をインクルードすることが重要です。ヘッダー ファイルは、実装なしで関数とクラスを宣言するため、重複が防止され、プログラム全体で各関数の定義が 1 つだけ存在することが保証されます。

以上が.h ファイルではなく .cpp ファイルを含めることを避けるべき理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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