函数定义的顺序对于C ++中的内联是否很重要

时间:2013-07-15 20:56:44

标签: c++ inline

当一个函数调用另一个函数并且需要内联时,这两个函数的定义的顺序是否重要?假设这两个定义出现在同一个翻译单元中。

我主要对C ++标准所说的内容感兴趣,如果有的话。但是,如果您有关于特定编译器中的内联行为的重要信息,我也会对此感兴趣。请假设没有发生链接时优化(被禁用)。

具体来说,根据C ++标准,以下两个版本是否同样可以实现内联?

第一版:

inline void foo() { ... }
void bar() { ... foo(); ... }

第二版:

inline void foo();
void bar() { ... foo(); ... }
void foo() { ... }

编辑:请注意,此问题关于inline关键字在实现内联方面的有效性。我特别询问标准是否说明了与实现内联相关的函数定义的顺序

2 个答案:

答案 0 :(得分:4)

C ++标准不会在此处进行任何拼版。编译器可以在任何他们认为合适的情况下自由内联或不内联。除了允许同一函数的多个定义之外,内联关键字可能没有任何效果。

大多数编译器都能够内联翻译单元可用的任何功能,无论它在源中出现的顺序如何。前向声明通常只会影响源文件中给定点的可用名称,而不会影响二进制文件的最终输出。

答案 1 :(得分:3)

实际上,inline关键字与内联代码的关系较少,而与允许{1}}一个定义规则有关。内联的主要目的是告诉编译一个函数可能出现在多个翻译单元中(并且每个翻译单元中的定义都相同)。这样可以避免在链接阶段出现多个定义错误。

使用legal violation关键字并不能保证编译器完全内联函数 - 这只是一个建议。此外,如果可以在翻译单元中看到定义并且编译器认为值得,则许多编译器将内联函数未标记为内联。我强烈怀疑你展示的任何一个版本都会由特定的编译器内联或不内联。

简而言之,让编译器决定是否内联,并以最易读的方式编写代码。