我知道标题看起来很愚蠢,但我认为值得一提。
以此声明(或定义,例如):
_Thread_local long volatile static int _Atomic const long unsigned x = 10;
我曾经将long long
视为一种类型,但如果它是一个类型名称,那么如何将多个限定符插入其中呢?
所以我用这个问题咨询了N1570,只是更加困惑。它提到了一些术语,如" type-specifier "和" 类型限定符",我无法在"类型说明符"中找到long long
,但不是&#t; t long long
C中的原始类型?有这么多书告诉我了!
澄清不重复:
是的,我看到了an existing question与long int long
的交易,但这个问题与限定符有关,并且在C中。
答案 0 :(得分:17)
如果你仔细阅读标准的正确位置,你会发现问题中的怪物声明是有效的,即使不可信。
'正确位'包括:
6.2.5类型
有五种标准的有符号整数类型,指定为
signed char
,short int
,int
,long int
和long long int
。 (这些和其他类型可能是 如6.7.2中所述,以其他几种方式指定。)...
对于每个有符号整数类型,都有一个相应的(但不同的)无符号 使用相同数量的整数类型(使用关键字
unsigned
指定) 存储(包括标志信息)并具有相同的对齐要求。6.7.2类型说明符
每个声明中的声明说明符中至少应给出一个类型说明符, 并在每个结构声明和类型名称的说明符限定符列表中。每个清单 类型说明符应该是以下多个集合之一(由逗号分隔,在那里 每个项目超过一个多个集合);类型说明符可能以任何顺序出现 与其他声明说明符混合。
...
long long
,signed long long
,long long int
或signed long long int
unsigned long long
或unsigned long long int
其他声明说明符包括存储类(示例中为static
和_Thread_local
),并键入限定符(volatile
和_Atomic
)。
6.7声明
6.7声明
语法
声明:的
declaration-specifiers init-declarator-listopt;
static_assert-declaration声明-指示符:
存储类说明符
声明-符<子>选择子>
type-specifier declaration-specifiers opt
type-qualifier声明说明符 opt
function-specifier declaration-specifiers opt
alignment-specifier declaration-specifiers opt
6.11.5存储类说明符
除声明开头之外的存储类说明符的位置 声明中的说明符是一个过时的功能。
分割整数类型关键字(类型说明符)也很古怪。宣言的更正统版本是:
static _Thread_local _Atomic const volatile unsigned long long int x = 10;
(或者它可能会删除int
)。