C++命名空间并乘以定义的变量

C++ namespaces and multiply defined variables

本文关键字:定义 变量 命名空间 C++      更新时间:2023-10-16

我有两个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

现在我有一个主文件.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 中,这怎么可能?

如果文件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];