多个 c++ 文件导致"multiple definition"错误?

Multple c++ files causes "multiple definition" error?

本文关键字:multiple definition 错误 c++ 文件 多个      更新时间:2023-10-16

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

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

那么,我需要做些什么来消除这个错误呢?

错误:

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

代码:

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

应该提到的是,这并不是唯一一个给我带来问题的函数,可能有十多个,有些并不是那么简短和甜蜜。此外,在多个文件中需要这些函数。

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

".cpp"answers".h"后缀在很大程度上是惯例问题。就编译器而言,一行代码来自哪里是无关紧要的。当您将该函数#包含到.cpp文件中时,您正在该.cpp文件实现该函数。

因此,当编译器完成并要求链接器将两个cpp文件中的代码编织在一起时,它会发现一个冲突:两个具有相同名称和指纹的函数(参数和返回)。这是一个错误。

您需要:

a。将实现放在一个源文件中,只需在头中留下一个原型声明

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

b。将函数标记为内联:当你调用函数时,编译器会根据需要插入函数体的副本,这可能会很浪费,但通常编译器可以找到有效的方法。

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

如果您在"CODE"后面引用的行在头文件中,您可以:

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