C ++内联函数:如此声明,定义为这样,或两者兼而有之?为什么?

时间:2017-06-27 19:32:38

标签: c++ inline

以下代码段编译时没有问题,即使foo是内联定义但未声明为此类,并且bar是内联声明但未定义为。

int foo();
inline int foo() { return 3; }

inline int bar();
int bar() { return 4; }

inline int foobar();
inline int foobar() { return 5; }

int main(){
    // ...
}

我的第一个问题:编译器是否将foo视为内联?那么bar呢?这是由C ++标准指定的吗?

我的第二个问题:其中哪一个是声明和定义内联函数的最佳做法?是foo吗? bar?还是foobar?为什么呢?

inb4我读了一些与此相关的帖子,但没有一个人直接回答我的问题。

This回答似乎表明foo是内联的,但对bar没有任何说明。它也没有解释为什么 foo优先于其他人。 This回答谈到何时应该使用内联函数。这不是我关注的问题:我已经决定使用内联函数。我的问题(问题2,确切地说)是我是否应该如此声明它,将其定义为这样或两者,以及为什么其中一个约定比其他约定更好。 This问题似乎更接近我的担忧,但没有人回答。

2 个答案:

答案 0 :(得分:2)

对于成员函数为True,而非为非成员函数明确定义(我相信)

参见ISO C ++标准中的§10.1.6。

  

内联说明符只能应用于声明或   变量或函数的定义

  

带有内联说明符的函数声明(11.3.5,12.2.1,14.3)声明了一个内联函数。

如果内联说明符仅修改函数的定义,则不会明确说明会发生什么。

我们可以肯定的是,此类成员功能可以保证标记为内嵌(感谢James Curran)。

见§12.2.1。

  

内联成员函数(无论是静态还是非静态)也可以   在其类定义之外定义提供它的   类定义中的声明或其定义之外的   class definition将函数声明为inline或constexpr。

GCC和非成员情况下的所有三个功能

与GCC -O1 C ++模式一样,所提到的每个函数都是内联的。

代码:

#include "stdio.h"

int foo();
inline int foo() {int i; for(i=0;i<100000;i++); return i+3; }

inline int bar();
int bar() {int i; for(i=0;i<100000;i++); return i+4; }

inline int foobar();
inline int foobar() {int i; for(i=0;i<100000;i++); return i+5; }

int foobar2();
int foobar2() {int i; for(i=0;i<100000;i++); return i+6; }

int main(){
    int a,b,c,d;
    a=foo();
    b=bar();
    c=foobar();
    d=foobar2();
    printf("%d %d %d %d", a, b, c, d);
}

拆卸: IDA

我们只能看到foobar2被调用。

-O2-O3一样,inline并不重要。编译器将自行决定(在上面的例子中,所有4个函数都是内联的)。

答案 1 :(得分:0)

(注意:我重新打开了这个问题,因为这不是引用旧问题的重复。这个问题涉及设计;这是关于语法的。)

现在,参考OP在他关于inline in definition and declaration的问题中引用的问题,答案指出如果声明在头文件中,那么它就是&#34;内联&#34; (&#34; bar style&#34;),因为使用该标头的其他源文件将尝试链接到它,就像它是非内联函数和文件一样。

就个人而言,我使用

 inline int foobar() { return 5; }
头文件中的

没有单独的声明。 (我总觉得,如果它太大而无法进入标题,那么它太大而无法内联。)