确定`_Thread_local`标识符链接的正式方法是什么?

时间:2018-01-28 02:19:51

标签: c language-lawyer c11 linkage thread-local-storage

这是关于C11标准中的角落案件的“语言 - 律师”类型问题。

确定C程序中标识符链接的规则将在下面详细说明 C11标准第6.2.2条。特别是,6.2.2(5)指出(强调我的):

  

如果函数的标识符声明没有存储类说明符,则其链接     确定它与使用存储类说明符extern声明的完全相同。如果     声明对象的标识符文件范围无存储类说明符,     它的联系是外部的。

如果文件范围中有_Thread_local int a;等声明,则上述6.2.2(5)不适用, 由于_Thread_local 存储说明符。 6.2.2的其他规定也不适用 (no static so(3)不适用,不在块范围内,是对象而不是参数,因此(6)不适用,等等。所以呢 根据标准 <{1}} 的链接?在这种情况下,我是否遗漏了一些确定联系的其他规则?

我理解的目的是让它具有外部联系(这是gcc如何处理这种情况)但是如何 这是否遵循标准本身?

请注意,完全可以拥有类似的声明 a在这种情况下,6.2.2规则适用于正常制作static _Thread_local int a; extern _Thread_local int a;具有内部链接(尽管a)。

最后,extern的语义与此无关。

1 个答案:

答案 0 :(得分:0)

正如我读到的那样,根据C11 6.2.4p4,在文件范围_Thread_local应用于main()的线程,有效地将它们作为main()的{}块中的静态或外部引用,而不是auto,和left implementation-定义了除main()之外的线程函数如何访问它们。我同意这似乎是一个缺陷,它没有提到任何对象_Thread_local的定义声明应该被要求具有静态或外部作为附加限定符,而不仅仅是&#39;可能出现&#39;作为引用声明,在6.7.1p2中。