【问题标题】:Multiple definitions error多重定义错误
【发布时间】:2014-03-25 03:31:33
【问题描述】:

我发布了这个问题,因为我遇到了一个非常奇怪的问题。 我有几个 .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 文件中定义(不在任何头文件中),并且仅在声明它们的文件中使用。

我解决了这个错误,在声明前加上了“静态”这个词,它工作得很好,但是我在调​​试器上遇到了一些问题(没有显示变量的值)。我发现如果我重命名上面的变量和函数,调试器的麻烦就会消失。 我决定在函数内部而不是全局声明变量,而不是重命名变量。我没有重命名这些功能。以这种方式,每次我在调用函数“cranknicolson1()”时突然调用它并且在做任何事情之前,程序都会崩溃。我认为这种非常奇怪的行为是由函数原型之前的“静态”一词引起的,因为我无法解释! 这是我的代码。 http://qpwoei.altervista.org/Code.zip 我强调了代码在执行任何操作之前在cranknicolson1() 中崩溃的事实!所以cranknicolson算法没有问题,但是别的。 希望有人可以帮助我,非常感谢您!

【问题讨论】:

  • 您的函数cranknicolson1 的问题与此问题不同。作为一个单独的问题提出。
  • 感谢您的建议,我已经创建了另一个主题:stackoverflow.com/questions/21971827/…希望您能帮助我!

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


【解决方案1】:

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

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

您的函数cranknicolson1 的问题与此问题不同。作为一个单独的问题提出。

【讨论】:

    【解决方案2】:

    您需要使用匿名命名空间将这些定义范围缩小到相应的 .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 和其他支持主题的信息(只需点击链接)。

    【讨论】:

    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多