以下代码段编译时没有问题,即使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问题似乎更接近我的担忧,但没有人回答。
答案 0 :(得分:2)
参见ISO C ++标准中的§10.1.6。
内联说明符只能应用于声明或 变量或函数的定义
和
带有内联说明符的函数声明(11.3.5,12.2.1,14.3)声明了一个内联函数。
如果内联说明符仅修改函数的定义,则不会明确说明会发生什么。
我们可以肯定的是,此类成员功能可以保证标记为内嵌(感谢James Curran)。
见§12.2.1。
内联成员函数(无论是静态还是非静态)也可以 在其类定义之外定义提供它的 类定义中的声明或其定义之外的 class definition将函数声明为inline或constexpr。
与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);
}
我们只能看到foobar2
被调用。
与-O2
和-O3
一样,inline
并不重要。编译器将自行决定(在上面的例子中,所有4个函数都是内联的)。
答案 1 :(得分:0)
(注意:我重新打开了这个问题,因为这不是引用旧问题的重复。这个问题涉及设计;这是关于语法的。)
现在,参考OP在他关于inline in definition and declaration的问题中引用的问题,答案指出如果声明在头文件中,那么它就是&#34;内联&#34; (&#34; bar style&#34;),因为使用该标头的其他源文件将尝试链接到它,就像它是非内联函数和文件一样。
就个人而言,我使用
inline int foobar() { return 5; }
头文件中的没有单独的声明。 (我总觉得,如果它太大而无法进入标题,那么它太大而无法内联。)