【问题标题】:inline function choose criteria内联函数选择标准
【发布时间】:2019-05-28 19:02:47
【问题描述】:

我有以下几点:

//a.cpp
inline int f(int x) { return x; }
int g(int x) { return f(x); }

//b.cpp
#include <iostream>
inline int f(int x) { return x + 1; }
extern int g(int);
int main() {
    std::cout << g(2) << f(2) << std::endl;
}

输出是22(MSVC和GCC),即a.cppf函数被内联而不是b.cpp一个。在这种情况下选择f函数的标准是什么?

【问题讨论】:

  • 你的意思是你编译链接了a.cpp和b.cpp?
  • 是的。没错!
  • 这似乎相关:One Definition Rule
  • 你开启优化了吗?我怀疑对于无优化/调试构建(无内联)与优化/发布构建(内联),您可能会得到不同的答案。

标签: c++ inline one-definition-rule


【解决方案1】:

您的代码格式错误,无需诊断。所有翻译单元中的所有内联函数定义都必须相同。

由于您不这样做,因此代码格式错误,但可以编译,并且不需要引起任何警告或错误。

【讨论】:

【解决方案2】:

您在此处破坏了 ODR(One Definition Rule)并且程序格式错误,无需诊断。

每个内联定义应该相同。

【讨论】:

  • 也许扩展 ODR 的含义将有助于完成此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
相关资源
最近更新 更多