多个定义错误

时间:2014-02-23 17:01:15

标签: c++ visual-studio-2012 multiple-definition-error

我发布了这个问题,因为我陷入了一个非常奇怪的问题。 我有一个几个.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;

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

我解决了这个错误,并将#34; static&#34;在声明之前,它工作正常,但我在调试器上遇到了一些麻烦(没有显示变量的值)。我发现如果我重命名变量和上面的函数,调试器的麻烦就会消失。 我决定在函数内声明变量而不是全局变量,而不是重命名变量。我还没有重命名这些功能。这样,程序每次调用函数时都会崩溃&#34; cranknicolson1()&#34;当它被调用时和在做任何事之前突然发生。我认为这种非常奇怪的行为是由&#34;静态&#34;在函数原型之前,因为我无法解释它! 这是我的代码。 http://qpwoei.altervista.org/Code.zip 我强调在执行任何操作之前代码在cranknicolson1()中崩溃的事实!因此,cranknicolson算法没有问题,但还有其他问题。 希望有人能帮助我,非常感谢你!!

2 个答案:

答案 0 :(得分:1)

您收到“多个定义错误”,因为您有相同外部可见名称的多个定义。那是违法的。它违反了“一个定义规则”。

你可以将它们放在一个未命名的命名空间中,就像mike.did建议或将它们限定为静态,这就是你所做的。但是,这两个解决方案都存在这个问题:为什么你有这么多全局变量?你的代码不是面向对象的。

您的功能cranknicolson1的问题与此问题不同。将此问作为一个单独的问题。

答案 1 :(得分:0)

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

您还可以在此处阅读Why are unnamed namespaces used and what are their benefits?What does putting a structure in an anonymous namespace do?Unnamed/anonymous namespaces vs. static functions和其他支持主题(仅点击链接)。