2

次の 2 つの C++ 名前空間があります。

#ifndef TRANS_H
#define TRANS_H
namespace Trans
{
   double Delta[3];
   double calcDeltaPositions();
   //and more that I will leave out for simplicity
};
#endif

#ifndef SPACE_H
#define SPACE_H
namespace Space
{
   double vels[3];
   void calcAccel(double DeltaVal[3]);
};
#endif

これで、main.cpp ファイルができました。

#include "Trans.h"
#include "Space.h"
int main()
{
    double pos = Trans::calcDeltaPositions();
    Space::calcAccel(Trans::Delta);
    return 0;
}

Delta が main.o と Trans.o で定義された乗算であると主張するエラーが何度も発生します。Delta が Trans に存在することを宣言しただけなので、これはどうしてでしょうか?

4

1 に答える 1

9

ファイルTrans.hSpace.hが複数の翻訳単位 (cpp ファイル - あなたの場合は と の両方) に含まれている場合、変数main.cpptrans.cpp複数回定義しているため、1 つの定義ルールに違反しています。

グローバルが必要な場合は、変数を として宣言externし、単一の実装ファイルで定義する必要があります。

翻訳単位ごとに変数のコピーが必要な場合 (おそらく不要)、それを宣言できますstatic

Delta が Trans に存在することを宣言しただけなので、これはどうしてでしょうか?

実際、あなたはしませんでした。それは定義であり、宣言ではありません。

//Trans.h
namespace Trans
{
    extern double Delta[3];
};

//Trans.cpp
double Trans::Delta[3];
于 2012-08-14T19:07:30.920 に答える