是否可以分隔内联函数的声明和定义?

时间:2012-07-11 08:01:36

标签: c++

我需要定义内联函数以提高代码的性能。目前,函数声明在.h文件中,定义在.cpp文件中。我在每个函数声明的前面添加了内联关键字,但是我收到链接错误。是否可以分隔内联函数的声明和定义?

8 个答案:

答案 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);
}
相关问题