1

現在、C++DLLライブラリを構築しています。今日、私は紛らわしい問題に遭遇しました。このライブラリでは、クラスを定義できますが、関数は定義できません。具体的には、問題を説明するために次のコードを示します。

namespace fundamental
{

    class Tree
    {
    public:
        Tree() {};
        ~Tree() {};
        int x;
    };

     /*int anyfunction()
    {
        return 1;
    }*/

}

上記の定義はヘッダーファイルにあり、このファイルは他のファイルによって呼び出されます。私の問題は、関数部分(int anyfunction())にコメントを付けるとすべてがうまくいくことですが、この関数を追加すると、次のエラーが発生します。

page_analysis.obj : error LNK2005: "int __cdecl fundamental::anyfunction(void)" (?anyfunction@fundamental@@YAHXZ) already defined in geo_box.obj
1>pa_region_properties.obj : error LNK2005: "int __cdecl fundamental::anyfunction(void)" (?anyfunction@fundamental@@YAHXZ) already defined in geo_box.obj

私の質問は、なぜ関数に対してのみLNK2005エラーが発生し、クラスに対しては発生しないのかということです。何か案は?

4

2 に答える 2

3

ヘッダーファイルで何かを定義すると、その定義は、そのヘッダーを含むすべての変換ユニット(大まかに言えば、すべてのソースファイル)に複製されます。複数の定義がエラーになる場合があります。

定義が同一である限り、クラスは複数の変換単位で定義できます。実際、それらは、それらを使用するすべての翻訳単位で定義する必要があります。

通常、関数はできませんが、宣言することで許可できますinline

inline int anyfunction() {return 1;}

または、定義を単一のソースファイルに移動し、ヘッダーでのみ宣言することもできます。

// header
namespace fundamental {
    int anyfunction();
}

// source file
int fundamental::anyfunction() {return 1;}
于 2012-07-12T16:30:06.520 に答える
2

ほとんどの場合、ヘッダーを介してその関数をさまざまな変換単位(別名cppファイル)に含めています。その関数を本当にインライン化する必要がある場合は、「インライン」を使用します。

inline int anyfunction()
{
    return 1;
}

HTHトルステン

于 2012-07-12T16:22:43.277 に答える