1

どういうわけかアイデアをつかむことができず、ドキュメントを読んでも役に立ちませんでした。

私の質問は次のとおりです。

  1. ヘッダー ファイル #include "general.h" をインクルードし、プロジェクトのディレクトリに general.h と general.cpp の 2 つのファイルがある場合、プリコンパイラが .cpp ファイルを自動的に検出するということですか?
  2. 拡張子なしでファイルを含めることはできますか: #include "general"?
  3. #include "general.cpp" というヘッダー ファイルなしでファイルをインクルードできますか?
  4. #include "general.txt" という txt ファイルを含めることはできますか?

Visual Studio 2010 でこれをすべて試しました。少なくとも構文エラーはありません。でも説明が欲しい。だから、あなたが親切で私を助けてくれることを願っています。

4

5 に答える 5

6

.cpp標準とコンパイラは、ファイルがまたはであるかどう.hかについてはあまり気にしません.monkeyface。ソースコードを実装ファイルとヘッダーファイルに構造化する背後にある概念は、実際には、ソースの管理を支援するための受け入れられた方法です。それにもかかわらず、受け入れられた方法でソースを構造化しないと、C++が正しくないか悪いと見なされることがよくあります。

指定したファイルの#include内容を現在のファイルに含めるようにプリプロセッサに指示するだけです。これは、他のファイルをコピーして自分のファイルに貼り付けるようなものです。あなたが言うとき#include "foo.h"、それはただ内容を含み、foo.hまったく気foo.cppにしません-それが存在することさえ知りません(そしてそれが存在しなければならない理由はありません)。

実装ファイルとヘッダーファイルでソースコードを構造化することは非常に便利です。依存関係や複数の定義に関する問題を回避し、コンパイル時間をいくらか改善します。#includeコードで別のクラスを使用する場合は、そのクラスのヘッダーファイルのみが必要です。その理由は、コードがクラスの実装を気にする必要がなく、コードがどのように見えるか(名前、メンバー、基本クラスなど)を知る必要があるためです。メンバー関数がどのように正確に実装されているかは関係ありません。

拡張機能.cpp.hは単なる規則です。.hppヘッダーファイルに使用することを好む人もいます。.tppテンプレートの実装に使用する人もいます。好きなように名前を付けることができます-はい、.txtファイルを含めることもできます。コンパイラはおそらくファイル拡張子からファイルに関すること(たとえば、どの言語としてコンパイルするか)を推測しようとしますが、それは通常オーバーライド可能です。

では、クラスを使用しているためにmain.cppインクルードする場合、どの時点で関与しますか?さて、の編集では、それはまったく関与していません。上で説明したように、クラスの実装について知る必要はありません。ただし、プログラム全体をコンパイルするときは、各ファイルをコンパイラーに渡して、個別にコンパイルします。つまり、のようなことをします。がコンパイルされると、コンパイル必要なヘッダーが含まれます。foo.hfoofoo.cppmain.cppmain.cpp.cppg++ main.cpp foo.cppfoo.cpp

.cppファイルがコンパイルされた後(依存するヘッダーを含める必要があります)、ファイルは相互にリンクされます。でのメンバー関数の使用は、foo::bar()この段階でで与えられmain.cppた実装にリンクされます。foo::bar()foo.cpp

于 2013-01-17T17:54:50.337 に答える
1

この#includeディレクティブは、プリプロセッサにファイルを読み取るように指示します。それで全部です。

于 2013-01-17T17:45:49.463 に答える
1

プリプロセッサは、#include ディレクティブに遭遇すると、指定されたファイルのコンテンツ全体を挿入するだけです。

于 2013-01-17T17:46:51.443 に答える
0

#includeは単純な「指定されたファイルの内容をここに挿入する」メカニズムであるため、プリプロセッサは指定したファイルを正確にインクルードします。.h ファイルをインクルードすると、プリプロセッサもコンパイラも対応する .cpp ファイルを認識しません。各 .cpp ファイルは個別にコンパイルされます (.h ファイルの目的は、.h ファイルの外部に存在する関数をコンパイラに通知することです)。現在の .cpp ファイル)。コンパイル後、リンカーが呼び出され、異なる .cpp ファイルのコンパイル結果が結合されます。

于 2013-01-17T17:54:52.383 に答える
0
  1. いいえ、プリコンパイラは .cpp ファイルについて何も知りません

  2. はい、ファイルに拡張子がない場合

  3. 任意のファイルを含めることができます。そこから何かが得られるというわけではありません。

  4. 上記のポイント 3. を参照してください。

于 2013-01-17T17:46:58.853 に答える