Dev-C ++中的多重定义错误

时间:2017-02-14 06:48:05

标签: c++

我在项目中名为Fares.cpp的文件中初始化了一些数组。当我在Dev-C ++中尝试在我的#include "Fares.cpp"文件中使用main.cpp(项目的主要代码所在的位置)时,编译器会给出一个错误,说“多重定义”。我不知道该怎么做,请帮忙。 我不太了解宏,extern等。

2 个答案:

答案 0 :(得分:2)

尝试添加"Fares.h"代替"Fares.cpp"#include通常用于包含头文件,它通常包含变量声明和函数原型。请查看此链接以获取更多信息:http://www.learncpp.com/cpp-tutorial/19-header-files/

答案 1 :(得分:2)

传统上,.c和.cpp文件与单个编译单元(模块等)相关,由编译器单独处理。包含意味着添加名为"头文件的文件"或"包含文件"在文件范围内,使声明,内联函数定义和类型定义可用于编译器的语法分析器。 声明包括:

  • 功能声明
  • 模板声明
  • 显式模板实例化
  • 明确的模板专业化
  • 命名空间定义
  • 链接规范
  • 属性声明(attr;)(自C ++ 11开始)
  • 空声明(;)(自C ++ 11起)

为避免多个相同类或函数的定义,头文件必须使用#ifndef块作为"括号"

// beginning of file.h
#ifndef SOME_UNIQUE_ID
#define SOME_UNIQUE_ID

// declarations , etc.

#endif
// end of file .h

没有什么可以阻止使用不同的后缀,这与构建过程的组织方式有关。人们普遍同意命名C文件.c,C ++ - .cpp,标准C ++标题根本不具有后缀,而所有其他标题可能都有.h或.hpp。包含内联函数的包含文件有时会被赋予.inc或.inl后缀而不是.h,但据我所知,这并没有以任何方式受到监管

每个相同的范围只能有一个具有相同ID的定义。更多甚至在您可能有多个文件范围时,对于每个.cpp,非静态声明会生成重复的ID,这会导致链接时错误。你真的应该避免使用.cpp作为包含文件,因为在大多数构建环境中,编译器会尝试多次链接它 - 对于#include中的每次使用以及作为单独的模块。

在您的情况下,您应该将数组的声明放入.h文件中,形式如下:

// fares.h
#ifndef FARES_H_
#define FARES_H_  // this will not allow declaration to be repeated

extern int gYourGlobalArray[100];

#endif

Word extern将告诉编译器该符号是在其他地方定义的并且可以在链接阶段找到,该对象应该是静态或线程存储持续时间,在我们的情况下,我们声明全局变量,并获得外部链接。 Fares.cpp将实现"实施"必须包含不会重复的符号。

// Fares.cpp
#include "fares.h" // necessary only if you require something declared there
// keep in mind that some file systems are case sensitive, some aren't and
// will not distinguish between Fares.h and fares.h

int  gYourGlobalArray[100] = {};

它实际上为文件范围内的数组定义了线程持续时间存储,并允许它在外部链接。在整个项目中,它的标识应该是唯一的(C ++编译器会破坏某些对象的名称,例如函数,但通常应该避免重用ID)。如果出于某些原因,文件范围中的ID在不同文件中重复但不应在外部链接,则应将此类存储声明为static,这将禁止外部链接。

声明类的静态成员通常要么在.cpp文件中需要类似的定义(没有关键字static),要么需要在类体内进行初始化,前提是编译器支持。

接下来,您只需将fares.cpp添加到project \ makefile \中,无论您将其用作编译环境。 fares.h将#include语句转换为需要它的.cpp或.h文件。 #include语句在技术上只是将所提到的文件的文本添加到文件中,正好在该位置。