我在课堂上有一些成员函数。当我使用内联说明符时,编译器会抱怨未定义的引用。
我试过了:
使用'inline'仅在类头文件中的函数定义之前。
在类.cpp(指定成员函数)的函数声明之前使用'inline'文件。
同时执行上述两项操作。
显然,其中一种方法是正确的做法,而其他方法则不正确。但是,尝试每个选项并没有让我得到一个编译的程序。
以下是我要做的事情:
.hpp文件:
class A{
void func();
}
.cpp文件:
...包括......
inline void A::func()
{
...
}
或者'内联'可能会转移到其他地方。我已经尝试了所有可能的组合,正如我上面所解释的那样。 (现在看一个人告诉我,我需要它在函数名和参数之后,比如关键字'const'。)
任何有关我做错的任何想法?我试着用谷歌搜索正确的答案,但没有运气。 “内联”函数是否在一个类中甚至是一个东西?
答案 0 :(得分:7)
必须在头文件中定义内联函数。函数的定义(正文)必须在尝试使用该函数的所有翻译单元中可见。您可以直接在类中定义它。或者您可以在代码中定义它,即在类之外。但它必须在头文件中,而不是在.cpp
文件中。
尝试在.cpp
文件中定义内联函数将使其仅在.cpp
文件中可用。尝试在其他.cpp
文件中使用它会导致链接器错误(即“未定义的引用”错误)。
答案 1 :(得分:1)
将inline
任何内容放在CPP文件中只能内联该文件中的函数。如果您想鼓励编译器内联函数,您需要忘记CPP文件。相反,在hpp文件中执行此操作:
class A{
inline void func();
};
void A::func() {...}
请注意几点:
如果在类中定义函数,它隐式具有inline关键字:
class A{
inline void func() {
...
}
};
与上面的内容相同,在类中内联声明,定义在外面。
有很多方法可以强制GCC使用函数属性内联你的代码,但是我不会描述它们,因为使用它们很少是个好主意。关于每个函数的内联,GCC应该做“最好”的事情。强迫它做其他事情几乎总会导致性能下降。