1

私は2つのファイルを持っています、utility.hそしてutility.cppBoundingSphere.hファイルで構造体を宣言します

struct BoundingSphere
{
    BoundingSphere();
    D3DXVECTOR3 _center;
    float _radius;
};
BoundingSphere::BoundingSphere()
{
    _radius = 0;
}

実装を.hファイルに入れるBoundingSphere::BoundingSphere()と、リンクエラーが発生します。エラーLNK2005:「public:__ thiscall BoundingSphere :: BoundingSphere(void)」はすでにbounding.objで定義されています

しかし、実装を.cppファイルに入れると、問題なく動作します。私の質問は、それがどのように起こり得るかということです。

4

2 に答える 2

3

これは、最初のコード例が単一定義規則に違反しているために発生します。

ヘッダーファイルに定義をインクルードすると、プリコンパイラーは、ヘッダーをインクルードするすべての変換ユニットにヘッダーのコンテンツをコピーして貼り付けるだけです。
最終的には、同じ関数の複数の定義が発生します。これにより、単一定義規則が破られ、リンカーエラーが発生します。

ヘッダーファイルに定義を追加する必要がある場合は、関数をとしてマークする必要がありますinlineinlineただし、関数への要求はコンパイラーへの単なる提案であり、自由に受け入れたり拒否したりできることに注意してください。

于 2012-04-10T08:44:13.910 に答える
2

Alsは真実を伝えますが(完全な真実ではありません)、質問に答えます。実装を.hファイルに入れると、ヘッダーを含む各ソースからコンパイルされたオブジェクトファイルに実装されます。したがって、複数の定義があります。.cppそれをファイルに入れると、そのファイルで一度だけ定義されます。

于 2012-04-10T08:46:32.510 に答える