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
。
i4、i5、i6 呢
_Thread_local int i4;
_Thread_local extern int i5;
_Thread_local static int i6;