暂定定义可以使用存储类说明符_Thread_local吗?

问题描述 投票:0回答:1

C17 草案规定以下内容(6.9.2,¶2):

具有文件范围且没有初始化程序、没有存储类说明符或带有存储类说明符

static
的对象的标识符声明构成了暂定定义。 [...]

有 5 个存储类别说明符:

extern
static
_Thread_local
register
auto
。其中,只有前 3 种可以出现在文件范围内。除了所有功能之外,
_Thread_local
可以(但不一定)与
extern
static
组合。因此,对于暂定定义,存储类说明符有以下几种可能性:

int i1; // tentative definition, external linkage
extern int i2; // non-definition declaration, external linkage
static int i3; // tentative definition, internal linkage
_Thread_local int i4; // ?, external linkage
_Thread_local extern int i5; // ?, external linkage
_Thread_local static int i6; // ?, internal linkage

(这里注意关键字

_Thread_local
不影响链接。)

i1
i3
的声明是暂定定义。但是
i4
i5
i6
呢?它们的声明是暂定定义吗?为什么或为什么不?

我猜测

i5
的答案是“否”,因为这两个条件都不是

  • 没有存储类别说明符
  • 具有存储类别说明符
    static

适用。但我不确定

i4
i6

c language-lawyer declaration
1个回答
0
投票

i4、i5、i6 呢

_Thread_local int i4;
  • 有存储类说明符
  • 不是静态的
  • 不是暂定的

  _Thread_local extern int i5;
  • 有存储类说明符
  • 不是静态的
  • 不是暂定的

  _Thread_local static int i6;
  • 有存储类说明符
  • 有静电
  • 暂定
© www.soinside.com 2019 - 2024. All rights reserved.