4

次の 3 つのファイル (1 つの *.cpp と 2 つの *.hpp) があります。

メイン プログラム ファイル:

// test.cpp

#include<iostream>
#include"first_func.hpp"
#include"sec_func.hpp"

int main()
{
    double x;
    x = 2.3;
    std::cout << sec_func(x) << std::endl;
}

- first_func.hpp ヘッダー:

// first_func.hpp

...

double  first_func(double x, y, x)
{

    return x + y + x;
}

- sec_func.hpp ヘッダー:

// sec_func.hpp

...

double sec_func(double x)
{
        double a, b, c;
        a = 3.4;
        b = 3.3;
        c = 2.5;

        return first_func(a,b,c) + x;
}

sec_func.hpp ファイル内から first_func を正しく呼び出すにはどうすればよいですか?

4

3 に答える 3

7

ほとんどの関数では、実装はコンパイル ユニットに存在する必要があります。これは、それ自体でコンパイルされ、一度コンパイルされるファイルです。

ヘッダーは単独でコンパイルされるのではなく*、複数のコンパイル単位に含まれます。

そのため、関数定義は、ヘッダーではなく、コンパイル ユニット (.cpp など) に配置する必要があります。ヘッダーには、他のコンパイル ユニットがそれらを呼び出す方法を認識できるように、宣言のみ (つまり、本体なし) を含める必要があります。


完全を期すために、一般的にヘッダーで定義する必要がある関数は次のとおりです (例外として)。

  • inline機能
  • テンプレート関数** (クラスも)

脚注:

*ヘッダーは実際にはプリコンパイルできますが、これはコンパイルを高速化するための解決策であり、目的を変更するものではありません。それに惑わされないでください。
**明示的なテンプレートのインスタンス化を使用する場合、テンプレート関数の定義をヘッダーの外に置くことができますが、それはまれなケースです。要点は、テンプレートをインスタンス化する (テンプレートに引数を適用する) 必要があるすべてのコンパイル ユニットには、完全な定義が必要であるということです。そのため、テンプレート関数の定義もヘッダーに入れられます。

于 2012-07-22T18:19:09.987 に答える
5

.hpp関数定義をファイルに配置することは悪い習慣です。そこには関数プロトタイプのみを配置する必要があります。このような:

first_func.hpp:

double  first_func(double x, double y, double x);

first_func.cpp:

double  first_func(double x, double y, double x)
{
    return x + y + x;
}

2番目の関数についても同じです。

そして、あなたがあなたを呼び出したいところはどこでも、あなたはそのモジュールfirst_funcに対応するものを含めるだけで、呼び出しを書きます。first_func.hppcpp

したがって、すべてのモジュールは、hppすべての宣言cppと定義(つまり、本体)で構成されます。このモジュールから何かを参照する必要がある場合は、そのモジュールを含めhpp、名前(定数、変数、関数など)を使用します。

そして、すべてをリンクする必要があります。

gcc main.cpp first_func.cpp second_func.cpp -o program
于 2012-07-22T18:15:11.687 に答える
3

inlineヘッダーで関数を定義するには、複数の定義を防ぐためにマークする必要があります。

実装を別のファイルに分離する代わりにこれを行う場合は、関数を呼び出す前にプロトタイプを提供する必要があります (ヘッダーを含める (推奨) か、関数を自分で宣言することにより)。

// sec_func.hpp

#include "first_func.hpp"
//or
double  first_func(double x, y, x); //declaration

double sec_func(double x)
{
        double a, b, c;
        a = 3.4;
        b = 3.3;
        c = 2.5;

        return first_func(a,b,c) + x;
}
于 2012-07-22T18:17:46.487 に答える