Multple C ++文件会导致“多重定义”的错误?(Multple c++ files caus

2019-10-18 09:15发布

我使用的是第一次一个项目多个C ++文件。 两者都需要包括受保护(的#ifndef)头文件。 然而,当我这样做,我得到了多个定义错误。

我所拥有的是两个一个.cpp文件直接调用头,和一个间接的(包括另一包括它),然后两块它包含其他头文件。

那么,我需要做什么才能摆脱错误的?

错误:

OBJ \调试\ main.o ||在功能Z14sortLibQtyTest4BookS_':| [PATH]\miscFuncs.h|16|multiple definition of Z14sortLibQtyTest4BookS_':| [PATH]\miscFuncs.h|16|multiple definition of sortLibQtyTest(图书,书)”

码:

bool sortLibQtyTest(Book a, Book b){ return a.getQty() > b.getQty(); }

应该提到的是,这不是给我的问题,大概十几是唯一的功能,还有一些不那么简单明了。 另外,还需要在多个文件的功能。

Answer 1:

您有两个选项来解决这个多重定义问题:标记方法内联,或将定义在.cpp文件。

1)标记的方法的内联:

// Foo.h

inline bool foo(int i) { return i = 42; }

2)将定义一个.cpp文件:

// Foo.h

inline bool foo(int i); // declaration

// Foo.cpp
bool foo(int i) { return i = 42; } // definition

该方法是否实际上是由在第一种情况下,编译器内联在这里无关紧要: inline允许你定义在头文件中的非成员函数没有打破一个定义规则。



Answer 2:

该“的.cpp”和“.h”头后缀大部分是习惯问题。 至于编译器而言,其中的一行代码来自无关。 当您#包括该功能到您的.cpp文件,要实现在.cpp文件该功能。

因此,当编译器完成,它要求链接器从你的两个cpp文件连结在一起的代码,它发现冲突:具有相同的名称和指纹(参数和返回值)两种功能。 这是一个错误。

您需要:

一种。 把实现在一个源文件,并且只留下一个原型声明在头

// .h
extern bool sortLibQtyTest(Book a, Book b);

// file1.cpp
bool sortLibQtyTest(Book a, Book b) { /* implementation */ }

湾 标记功能内嵌:当你调用该函数,编译器会作为插入所需的函数体的副本这可能是浪费的,但很多时候,编译器可以找出有效的事情。

inline bool sortLibQtyTest(Book a, Book b) { return a.getQty() < b.getQty(); }

C。 标记功能,它告诉编译器创建函数的副本,包括它所有的源文件,而不是把它暴露在连接器“静态”。 如果一些源文件包含头不使用函数,编译器检测到并删除它 - 这不是所有的编译器/优化级别做的,所以它可以是双重浪费。

static bool sortLibQtyTest(Book a, Book b) {return a.getQty() < b.getQty(); }

d。 避免C的缺点,将其标记静态内嵌

static inline bool sortLibQtyTest(Book a, Book b) { return a.getQty() < b.getQty(); }


Answer 3:

如果“CODE”后引述该行是在头文件中,您可以:

  • 加上inline的定义或
  • 从头部取出的函数体,并把它放到你的源文件1(只有1)。


文章来源: Multple c++ files causes “multiple definition” error?