【发布时间】:2017-10-03 17:41:35
【问题描述】:
我有一个这样的 hpp 文件:
#ifndef __MYLIB_H
#define __MYLIB_H
class A {
public:
void func1();
void func2();
};
void A::func1() {
// maybe do something
}
#endif
有一个对应的cpp文件,里面有func2的实现。头文件包含在项目中的其他文件中(这些文件包含在更多文件中)。当我尝试构建它时,我收到func1 的“多重定义”链接器错误。为什么会发生这种情况?由于我已经用#ifndef 保护了头文件,所以我没想到会出现错误。
如果我将关键字inline 添加到func1 的定义中,那么一切都很好。因此,如果我不关心被内联的函数并且我不想在类主体中有定义,我不能在 hpp 文件中包含它的定义吗?如果有人可以解释这里发生了什么,那将非常有帮助。我正在使用 GCC 6。
【问题讨论】:
-
这不是问题,但是包含两个连续下划线 (
__MYLIB_H) 的名称和以下划线后跟一个大写字母的名称保留供实现使用。不要在你的代码中使用它们。 -
inline并不意味着编译器会内联函数。它只允许您将它包含在多个位置(即具有多个定义)。类体内定义的函数隐式为inline。 -
@PeteBecker 那么也许我可以使用 MYLIB_H 代替?
-
MYLIB_H-- 当然。