我需要定义内联函数以提高代码的性能。目前,函数声明在.h文件中,定义在.cpp文件中。我在每个函数声明的前面添加了内联关键字,但是我收到链接错误。是否可以分隔内联函数的声明和定义?
答案 0 :(得分:5)
您可以将声明和定义分开,但该定义必须在每个使用该功能的翻译单元中都可用,例如:
#include <iostream>
inline void foo();
int main() {
foo();
}
inline void foo() {
std::cout << "Hi\n";
}
完全合法且正确。
n3290§7.1.2.4的确切引用是:
内联函数应在每个使用过的翻译单元中定义,并且应具有确切的内容 在每种情况下(3.2)都有相同的定义。 [注意:在它之前可能会遇到对内联函数的调用 定义出现在翻译单元中。 - 后注]
其中§3.2基本上表示它必须在任何地方都相同,甚至超载分辨率等。
答案 1 :(得分:2)
您是否绝对相信让您的功能“内联”可以改善您的表现?我很确定它不会。
当且仅当它能够看到内联函数的主体时,编译器才能内联一些函数调用。因此,您还需要包含函数体,但是如果这样做,则不需要使用'inline'来注释函数,因为编译器只需要函数的主体 - 而不是'inline'关键字。如今的编译器很聪明,并且不知道是否以及何时内联函数。并且内联不一定会提高程序的性能,并且可能会增加可执行文件的大小。
见Herb Sutter的this article。他认为关键词“inline”在C ++中没有任何意义。但我不同意他的意见。关键字“inline”有一个区别:您可以在程序中多次指定内联函数的主体(假设每次都是完全相同的定义) - 这在将函数体放入头文件时很有用(如果需要)这出于任何原因)。
答案 2 :(得分:1)
使用单独的“实施标题”,您仍会包含在哪里?
答案 3 :(得分:1)
您只需要指定一次原型或实现。两者都符合条件。
答案 4 :(得分:1)
根据定义,必须在编译时知道内联函数。 如果要在单独的.h文件中定义它们,可以使用
#pragma一次
只能插入一次定义。
答案 5 :(得分:1)
是的,但您必须将实现放在头文件中。这是因为为了无衬里,在包括标题时必须知道定义。
如果您这样做,即使没有inline
关键字,现代编译器也会自动内联函数。
答案 6 :(得分:0)
我发现在某些嵌入式工具链中,函数声明中不允许使用#inline关键字。您可以在定义中指定它,但是(如上所述)许多编译器无论如何都会忽略该关键字。
答案 7 :(得分:-1)
//这可用于g ++编译器。 //Calc.h
class Calc
{
int Sum(int x, int y);
};
// Calc.cpp
inline int Calc::Sum(int x, int y)
{
return (x+y);
}