C++命名空间和多个定义的变量

Cod*_*lus 2 c++ namespaces definition

我有两个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
Run Code Online (Sandbox Code Playgroud)

现在我有一个main.cpp文件:

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

我一直得到一个错误,声称Delta是main.o和Trans.o中的多重定义.这怎么可能是因为我只声明Delta存在于Trans中?

Luc*_*ore 9

如果文件Trans.hSpace.h被包含在多个翻译单元(cpp文件-在你的情况下,无论是main.cpptrans.cpp),您有变量多次定义,从而打破了一个定义规则.

如果您想要全局,则需要将变量声明为extern并在单个实现文件中定义它.

如果您想要每个翻译单元的变量副本(可能不是),您可以声明它static.

怎么会这样,因为我只宣布Delta存在于Trans?

实际上,你没有.这是一个定义,而不是一个声明.

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

//Trans.cpp
double Trans::Delta[3];
Run Code Online (Sandbox Code Playgroud)