1

ヘッダーを持つ別のhi.cppファイルの関数fhiを使用する「HelloWorld」コードがあります。

私の理解が間違っている場合は、次のように訂正してください。

#include "c:\c\hi.cpp"ヘッダーファイルで読みやすくなるという事実を除いて、問題なくヘッダーを使用する代わりにcppファイルをインクルードでき ます。

メインプログラムにサンプルのようなヘッダーを含める場合は、を含める必要がhi.hあります。そうしないと、同じファイル名に従って自動的に行われます。コンパイラが関数本体がどこにあるかをどのように知っているのか疑問に思います。hi.hhi.cpphifhi

ヘッダーファイルとCPPファイルに異なる名前を付けることは可能ですか?

プログラム:

#include "stdafx.h"
#include "c:\c\hi.h"


int _tmain(int argc, _TCHAR* argv[])
{
fhi(1);
return 0;
}

hi.h

 #include <cstdlib>
 #include <iostream>

 int var;
 int  fhi(int f);

hi.cpp

 #include <cstdlib>
 #include <iostream>

 int  fhi(int f)
 {
 return 0;
 }
4

5 に答える 5

2

hi.hにはhi.cppを含める必要があります

いいえhi.h。宣言のみが含まれ、他の.cppファイルによって他の宣言になる可能性があります。

コンパイラが関数fhibodyがどこにあるかをどのように知っているのか疑問に思います。

そうではありません。すべての*.cppファイルをオブジェクトファイルにコンパイルする必要があります。あなたの場合、2つのオブジェクトファイルがあります:program.ohi.o。これで、リンカはこれら2つのオブジェクトファイルを取得して、実行可能ファイルを吐き出すことができます。他の関数(この場合はfhi(..)の実際の定義)への参照は、この段階で解決されます。

また、なぜ#includesで絶対パスを使用しているのですか?「c」ディレクトリを移動すると壊れます。

于 2012-08-08T10:32:46.107 に答える
2

通常は、ビルドシステムが.cppファイルをオブジェクトファイルにコンパイルし、それを使用してメインの実行可能ファイルをビルドします。これをビルドシステムに伝える手段は大きく異なります。

重要な点の1つは、を含めるhi.cpp 必要hi.hがあるということです。また、翻訳ユニットに複数回含まれることを安全にするために、インクルードガードを配置する必要があります。hi.h

于 2012-08-08T10:33:42.657 に答える
2

#include "c:\c\hi.cpp" のような cpp ファイルをインクルードできます。ヘッダー ファイルの方が読みやすいという事実を除いて、ヘッダーを使用する代わりに問題なく使用できます。

はい、できますが、お勧めしません。問題の 1 つはカプセル化です。実装の詳細を隠していません。あなたが言及した読みやすさも懸念事項です。ヘッダーは、どのメソッドが公開されているかを明確に示しているため、読みやすくなっています。

サンプルのようなヘッダーをメイン プログラム hi.h に含める場合、hi.h に hi.cpp を含める必要があります。そうしないと、同じファイル名 hi に従って自動的に行われます。コンパイラが関数 fhi 本体の場所をどのように知っているのか疑問に思っています。

ヘッダーは、ヘッダーで定義されたクラスを使用する hi.cpp および任意の .cpp ファイルに明示的に含める必要があります。

ヘッダーと cpp ファイルに別の名前を付けることは可能ですか?

はい、しかしお勧めしません。物を見つけるのが難しくなります。

原則として、他のプログラマーがあなたのコードを調べたがる可能性があることを考慮してください。そのため、読みやすく理解しやすいように構造化する必要があるだけでなく、2 年後に物事がどこにあるかを簡単に覚えられるようにする必要があります。 .

于 2012-08-08T10:34:38.770 に答える
2

Visual Studio では、プロジェクトに含まれるすべての CPP ファイルがコンパイルされ、OBJ ファイルが生成されます。これらの OBJ ファイルは、相互にリンクされて EXE または DLL を形成します。

ファイルを含めることは、ファイルの内容をその場所に貼り付けることに似ています。唯一の違いは、この貼り付けがコンパイル中にプリコンパイラによって行われることです。

関数本体が存在する場所を見つけることは、関数がインラインの場合はコンパイラによって、または最終的なバイナリが作成されるときにリンカーによって行われます。

于 2012-08-08T10:35:02.230 に答える
2

まず、ヘッダー ファイルがそれを含むソース ファイルと同じディレクトリにある場合は、

#include "hi.h"

つまり、フル パスを使用する必要はありません。(たとえば、 の組み込みを参照してください"stdafx.h"。)

第二に、ヘッダー ファイルに他のヘッダー ファイルを含める必要はありません。ただし、それらの型が必要な場合を除きます。ヘッダー ファイルには、インクルードするヘッダー ファイルから必要なものは何もありません。

3 番目に、ヘッダー ファイルが同じソース ファイルに複数回インクルードされないように保護する必要があります#pragma once

4 番目に、ヘッダー ファイルでグローバル変数を定義varします。この変数は、ヘッダー ファイルをインクルードするすべてのソース ファイルで定義されるため、エラーが発生します。extern変数を次のように宣言する必要があります。

extern int var;

次に、1 つのソース ファイルで、現在行っているように変数を定義します。

第 5 に、ヘッダー ファイルにソース ファイルを含めるべきではありません (ただし、まだ考える必要のないいくつかの特別な例外があります)。代わりに、すべてのソース ファイルをプロジェクトに追加すると (MS VisualStudio を使用していると仮定します)、それらはすべて自動的にビルドおよびリンクされます。

第 6 に、VisualC++ を使用しているように見えるので、おそらくprecompiled headersと呼ばれるものを使用しています。これは、コンパイラがコンパイルを高速化するために使用するものです。ただし、これを機能させるには"stdafx.h"、すべてのソース ファイルに含める必要があります。そのインクルードは、実際には各ソース ファイルの最初の非コメント行でなければなりません。

于 2012-08-08T10:37:42.283 に答える