2

何かを行うためのクラスを定義した場合、それを使用するために必要なのは、メソッドのプロトタイプを含むヘッダーファイル(.hファイル)をインクルードすることだけですが、クラスファイル自体(クラスメソッドの実際の実装を含む.cppファイル)、

これは、コンパイラが名前を照合して.cppファイルを見つけるために、.cppファイルの名前がヘッダーファイルと同じである必要があることを意味しますか?

また

コンパイラが関数(メソッド)呼び出しに出会うと、ヘッダーファイルに移動し、プロトタイプがあるかどうかを確認します。次に、組み込み関数で実装を検索します。見つからない場合は、現在のディレクトリ内のすべての.cppファイルを検索しますか?

または、両方の仮定が正しくありませんか?

4

3 に答える 3

4

ファイル名は C++ では無関係です。リンカーはすべてのピースをまとめます。少しの C++ コードをコンパイルするときに知っておく必要があるのは、名前の意味だけです。そして、それが宣言クラス定義の目的です。これらは名前を導入し、コンパイラにコードを生成するのに十分な情報を提供します:

file1.cpp:

int f(int, bool);         // declaration

class Foo;                // class declaration

class Bar { int g(); };   // class definition (implies declaration)

int main()
{
    Foo * p;              // OK, Foo * is a complete type, since we know that
                          // "Foo" denotes a class

    // p->h();            // Error: We don't know what Foo actually is!

    Bar b;                // OK, we know how size and alignment for Bar

    int m = b.g();        // OK, we know what sort of function B::g() is

    int n = f(50, true);  // OK, we don't need to know what f does

    return m + n;
}

上記のコードをコンパイルすると、 との未解決のシンボルが含まfれますB::g1 つ(そして 1 つだけ) の他の翻訳単位にこれらのシンボルの定義が含まれている限り、リンカーはそれらを解決でき、プログラムを正常にリンクできます。

file2.cpp:

int f(int n, bool b) { return b ? n * 2 : 50 - n; }

// include class definition here
int Bar::g() { return f(sizeof(Bar), sizeof(int) == sizeof(char)); }

基本的なルールは、関数またはクラスを宣言したり、クラス a を定義したりできますが、関数とクラス メンバー関数は 1 回しか定義できないということです。例外が 1 つあります。クラス メンバー関数の関数を として宣言した場合、すべての定義が同一であればinline、実際に繰り返し定義できます。

この規則の当然の帰結は、1 つの翻訳単位で実際の定義を 1 回だけ提供する限り、すべての関数宣言とクラス定義をヘッダー ファイルに安全に配置し、繰り返しインクルードできることです。(そして、inlineルールにより、クラス定義内に実際のメンバー関数定義を含めることができます。宣言と共に定義されるメンバー関数は暗黙的にinline.)

于 2013-01-20T11:40:12.853 に答える
2

コンパイラはヘッダーファイルのみを必要とします。ただし、リンカが最終的なバイナリを生成できるように、すべてのC++ファイルをコンパイルする必要があります。

于 2013-01-20T11:30:05.053 に答える
1

プログラムを作成するには、コンパイラーに両方が必要です。通常、C ++からバイナリへのコンパイルは2つのステップで行われますが、最初にすべてのCPPファイル(別名変換ユニット)がオブジェクトファイル(主にマシンコードとアドレステーブルを含む)に変換されます。次に、オブジェクトファイルが相互に接続(リンク)され(アドレステーブルが必要)、最終的な実行可能ファイルが形成されます。通常、ヘッダーファイルでは、「これらのパラメーターとこの戻り値を持つ関数があります」と言います。オブジェクトファイルでは、その関数への呼び出しがその関数への参照として記録されます。最後に、リンク時に、この参照は、他のオブジェクトファイルによって提供される必要がある関数の実際のアドレスで解決されます。

于 2013-01-20T11:37:33.073 に答える