【发布时间】:2017-06-27 19:32:37
【问题描述】:
以下代码段编译没有问题,即使 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 问题似乎更接近我的关注,但没有人回答。
【问题讨论】:
-
我认为两者都违反了单一定义规则:en.cppreference.com/w/cpp/language/definition
-
像
{ return 3; }这样简单的函数几乎肯定会被内联,无论您如何定义/声明它。 -
@James 这是一个简单的代码 sn-p 来演示我的问题。发布一个“现实”的功能会分散我的主要观点。
-
@Richard 定义了三个函数:foo、bar 和 foobar。哪两个违反了单一定义规则? (怎么回事?我只定义了一次函数。)另外请参阅我的原始问题。 (第一个问题和第二个问题)
-
@RichardCritten - 没有。每个函数只定义一次。它们有一个可能相互冲突的声明,但只有一个定义。