多个定义错误

Multiple definitions error

本文关键字:错误 定义      更新时间:2023-10-16

我发布这个问题是因为我遇到了一个非常奇怪的问题。我有一个包含一些.cpp文件和一些头文件的项目。特别是,这段代码出现在三个不同的.cpp文件中:

void printGraph2d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
void printGraph3d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
double alpha = 0.000217f;
double hBarra = 0.04f;
double uWall = 100;
double dt = 0.0001f;
const unsigned int Y = 41;
const unsigned int M = 15000;
double dy = hBarra/(Y - 1);
double grid [M][Y];
std::vector <std::array <double, 4> > tridiagonal;
unsigned int intervalliTemporali;

并且在每个文件中具有不同的角色。我想知道编译器为什么会给我"多重定义错误"。这两个函数原型和变量仅在.cpp文件中定义(不在任何头文件中),并且仅在声明它们的文件中使用。

我解决了这个错误,将单词"static"放在声明之前,它工作得很好,但我在调试器方面遇到了一些问题(没有显示变量的值)。我发现,如果我重命名了上面的变量和函数,调试器的问题就会消失。我决定在函数内部而不是全局声明变量,而不是重命名变量。我没有重命名函数。通过这种方式,每当我在调用函数"cranknicolson1()"时以及在执行任何操作之前突然调用该函数时,程序都会崩溃。我认为这种非常奇怪的行为是由函数原型之前的"静态"一词引起的,因为我无法解释!!!这是我的密码。http://qpwoei.altervista.org/Code.zip我强调了这样一个事实:在做任何事情之前,代码在cranknicolson1()中崩溃!所以曲柄尼科尔森算法没有问题,但有其他问题。希望有人能帮助我,提前非常感谢!!

您会得到"多个定义错误",因为您有多个具有相同外部可见名称的定义。这是违法的。它违反了"一个定义规则"。

你可以按照mike.did的建议,将它们放在一个未命名的命名空间中,或者将它们限定为静态,这就是你所做的。然而,这两种解决方案都回避了真正的问题:为什么有这么多全局变量您的代码不是很面向对象。

您的函数cranknicolson1的问题与此问题不同。请单独提问。

您需要通过使用匿名名称空间将这些定义范围缩小到相应的.cpp文件。否则,符号将被发布,并可用于其他翻译单元。

您还可以阅读关于为什么使用未命名的命名空间以及它们的好处是什么?,把一个结构放在一个匿名名称空间里做什么?,这里的未命名/匿名名称空间与静态函数和其他支持主题(只需点击链接)。