多个c ++文件导致"多个定义#34;错误?

时间:2013-07-15 04:49:23

标签: c++ multiple-definition-error

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

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

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

ERROR:

  

obj \ Debug \ main.o ||在函数Z14sortLibQtyTest4BookS_':| [PATH]\miscFuncs.h|16|multiple definition of sortLibQtyTest(Book,Book)'

CODE:

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

应该提到的是,这不是唯一给我带来问题的功能,可能超过十个,有些不是那么短而且很甜。此外,多个文件中还需要这些功能。

3 个答案:

答案 0 :(得分:3)

您有两种方法可以解决此多重定义问题:将方法标记为内联,或将定义放在.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允许您在不破坏一个定义规则的情况下在头文件中定义非成员函数。

答案 1 :(得分:2)

“。cpp”和“.h”后缀在很大程度上是常规问题。就编译器而言,代码行来自哪里是无关紧要的。当您将该函数#include到.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(); }

℃。将该函数标记为“static”,它告诉编译器为包含它的每个源文件创建函数的副本,但不将其公开给链接器。如果某些源文件包含不使用该函数的头文件,编译器必须检测到并删除它 - 这并非所有编译器/优化级别都这样做,因此可能会造成双倍的浪费。

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(); }

答案 2 :(得分:1)

如果您在“CODE”之后引用的行在头文件中,您可以:

  • inline添加到定义或
  • 从标题中删除函数体并将其放入1(仅1个)源文件中。