多个定义错误
Multiple definitions 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;
并且在每个文件中具有不同的角色。我想知道编译器为什么会给我"多重定义错误"。这两个函数原型和变量仅在.cpp文件中定义(不在任何头文件中),并且仅在声明它们的文件中使用。
我解决了这个错误,将单词"static"放在声明之前,它工作得很好,但我在调试器方面遇到了一些问题(没有显示变量的值)。我发现,如果我重命名了上面的变量和函数,调试器的问题就会消失。我决定在函数内部而不是全局声明变量,而不是重命名变量。我没有重命名函数。通过这种方式,每当我在调用函数"cranknicolson1()"时以及在执行任何操作之前突然调用该函数时,程序都会崩溃。我认为这种非常奇怪的行为是由函数原型之前的"静态"一词引起的,因为我无法解释!!!这是我的密码。http://qpwoei.altervista.org/Code.zip我强调了这样一个事实:在做任何事情之前,代码在cranknicolson1()中崩溃!所以曲柄尼科尔森算法没有问题,但有其他问题。希望有人能帮助我,提前非常感谢!!
您会得到"多个定义错误",因为您有多个具有相同外部可见名称的定义。这是违法的。它违反了"一个定义规则"。
你可以按照mike.did的建议,将它们放在一个未命名的命名空间中,或者将它们限定为静态,这就是你所做的。然而,这两种解决方案都回避了真正的问题:为什么有这么多全局变量您的代码不是很面向对象。
您的函数cranknicolson1
的问题与此问题不同。请单独提问。
您需要通过使用匿名名称空间将这些定义范围缩小到相应的.cpp文件。否则,符号将被发布,并可用于其他翻译单元。
您还可以阅读关于为什么使用未命名的命名空间以及它们的好处是什么?,把一个结构放在一个匿名名称空间里做什么?,这里的未命名/匿名名称空间与静态函数和其他支持主题(只需点击链接)。
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++