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

标签 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

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

最佳答案

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

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

如果您想要每个翻译单元的变量拷贝(可能不需要),您可以将其声明为static

How could this be since I have only declared Delta to exist in Trans?

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

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

//Trans.cpp
double Trans::Delta[3];

关于C++ 命名空间和多重定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959082/

相关文章:

c++ - 为什么 `true` 和 `false` 都被认为是变量?

api - 我需要 REST API 包吗?

c++ - 钻石方形算法创建对角线切割

C++ 等效于从 popen 读取的 fgets

php - 有哪些实用的 PHP 命名空间解决方案?

c# - 命名空间 c# 中的方法

C++ 命名空间和链接不起作用

python - 什么是 alpha 修剪均值滤波器?

c++ - 模板类的多个可变参数包

c++ - 使用 -O3 编译时出现奇怪的段错误