我使用的是第一次一个项目多个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(); }
应该提到的是,这不是给我的问题,大概十几是唯一的功能,还有一些不那么简单明了。 另外,还需要在多个文件的功能。
您有两个选项来解决这个多重定义问题:标记方法内联,或将定义在.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”和“.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(); }