静态内联函数中的局部函数静态对象不共享

戈斯温·冯·布雷德洛

bla.h中包含以下内容:

#include <iostream>

static inline void bla() {
  static int x;
  std::cout << "bla @ " << (uintptr_t)bla << ": x @ " << &x << std::endl;
}

然后从2个单独的转换单元调用bla(),得到以下输出:

bla @ 94796100194693: x @ 0x56376fe10178
bla @ 94796100194897: x @ 0x56376fe10180

阅读内联说明符后,这让我有些惊讶

它说:

在内联函数中,

  • 所有函数定义中的局部函数静态对象在所有转换单元之间共享(它们均引用一个转换单元中定义的同一对象)

在该句子中,它并不将其限制为“具有外部链接(例如,未声明为静态) ”,就像在之前的段落中那样,“在每个翻译单元中都有相同的地址”。

所以我希望输出显示的不同地址,bla显示相同的地址x

这是g ++中的错误吗?

注意:这特定于C ++ 17中内联的更改含义。

戈斯温·冯·布雷德洛

正如Igor Tandetnik所评论的那样,该错误出在cppreference.com上,因为它们忽略了该标准的重要部分:

C ++标准的实际文本在[dcl.inline] / 6中有此注释:“具有外部链接的内联函数中的静态局部变量始终引用同一对象。”

强调我的。– Igor Tandetnik 10月20日4:12

因此,观察到的行为符合标准。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类中的静态内联函数

具有外部链接的内联函数中对静态对象的引用

跟踪静态内联函数

头文件中的静态内联函数

函数的静态局部变量对象在哪里定义?

Scilab 函数中静态局部变量的等价物

涉及静态局部变量的递归函数中的意外输出

静态函数中的引用列表<>对象?

可以在不同的文件中定义同名的静态内联函数吗?

何时使用静态内联而不是常规函数

GCC可以从静态库内联函数吗?

C ++,静态对象构造函数中的异常会绕过先前静态对象的析构函数

在定义该函数的函数外部操作局部静态指针变量

gcc中共享库函数的静态链接

使用静态内联到在 C 中调用其他较大函数的函数

为什么这些函数局部静态对象的破坏顺序与初始化顺序相反?

具有外部链接的内联函数定义,其中包含对静态对象的引用

在片段的静态函数中创建带有对象的Hashmap

PHP中的getMessage()函数是否被对象静态引用?

什么是C中的“静态”函数?

Dart中的静态构造函数

C中的静态函数

函数中的静态内存[PHP]

使AzureServiceTokenProvider在Azure函数中静态

公共静态double verifyDouble函数不返回

C ++中的静态构造函数?我需要初始化私有静态对象

为什么允许在非静态构造函数中为静态只读字段对象定义SendCompletedEventHandler?

如何从静态类函数初始化静态类对象

从函数返回指向局部变量的静态指针