【问题标题】:Inline functions with same type but different body in .cpp files.cpp 文件中具有相同类型但主体不同的内联函数
【发布时间】:2020-10-26 12:52:34
【问题描述】:

有点奇怪,不是很实用,但我在 cpp 中使用内联尝试一些随机的东西,我想试试这个:

 inline void foo(void){static int x=0; x++; cout << x << '\n'; return;};

在另一个 .cpp 文件中我得到了:

 inline void foo(void){static int x=0; x=x+2; cout << x << '\n'; return;};

现在,这出于某种原因(相同的函数类型/名称)但不同的主体,它们都共享相同的'x',但它们的定义不一样。我希望编译器会抱怨,但事实并非如此。这是为什么呢?

【问题讨论】:

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


【解决方案1】:

你陷入了一种未定义的行为。

编译器什么也没说,因为:

每个程序都应该包含每个非内联的定义 函数或变量在该程序之外的 odr 中使用 丢弃的语句;无需诊断。定义可以出现 明确地在程序中,它可以在标准或 用户定义的库,或者(在适当的时候)它是隐式定义的 (参见 [class.ctor]、[class.dtor] 和 [class.copy])。内联函数 或变量应在其所在的每个翻译单元中定义 odr-在废弃语句之外使用。

有关herecppreference site 的更多详细信息

【讨论】:

  • 如果定义完全相同,是否仍会被视为未定义行为?我猜不是,因为它会产生与首先在标题中包含定义相同的效果,只是确保。此外,如果我在头文件中声明函数 inline 并从 .cpp 文件中的定义中省略它会发生什么,反之亦然?谢谢!
  • 永远是一种未定义的行为,因为您不知道自己采用的是哪种定义。在定义完全一样的情况下,显然结果是相等的,但这并不意味着它不是UB。
  • 您能否详细说明一下,因为我有点困惑?在两个地方具有完全相同的定义与将其包含在头文件中然后将其包含在每个 TU 中不会具有相同的效果吗?那为什么还是UB呢?
  • 是 UB,因为您在任何情况下都对同一个函数有多个定义。同样具有相同的行为,包含文件将有所不同,并且编译器不会在调用它们的代码中转换内联函数。有时编译器会做一些优化,所以什么都不会被授予
  • @pol 好吧,从技术上讲不是。例如您可能有一个宏,#defines 是一个标记,在一个定义中表示其他定义而不是另一个定义。那将是UB。还有其他方法可以改变含义,但规则基本上是,“所有标记必须看起来并且在每个定义中都表示相同的东西”。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 2021-07-12
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多