我第一次在一个项目中使用多个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(); }
应该提到的是,这不是唯一给我带来问题的功能,可能超过十个,有些不是那么短而且很甜。此外,多个文件中还需要这些功能。
答案 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
添加到定义或