C长型是多久?

我知道标题看起来很愚蠢,但我认为这值得一提。

以此声明(或定义,可能)为例:

_Thread_local long volatile static int _Atomic const long unsigned x = 10; 

我曾经认为long long是一个类型,但如果它是一个类型名称,那么如何插入这么多限定符呢?

所以我用这个问题咨询了N1570,只是为了更加困惑。 它提到了一些术语,如“ 类型说明符 ”和“ 类型限定符 ”,我在“类型说明符”中找不到多long long ,但在C中不long long的原始类型? 有这么多书告诉我了!


澄清不重复:

是的,我看到一个现有的问题涉及long int long ,但这个问题与限定符有关,并且在C中。

如果你仔细阅读标准的正确位置,你会发现问题中的怪物声明是有效的,即使不可信。

‘正确位’包括:

6.2.5类型

有五种标准的有符号整数类型,指定为signed charshort intintlong intlong long int 。 (这些和其他类型可以用其他几种方式指定,如6.7.2中所述。)

对于每个有符号整数类型,存在相应(但不同)的无符号整数类型(使用关键字unsigned指定),其使用相同数量的存储(包括符号信息)并具有相同的对齐要求。

6.7.2类型说明符

每个声明中的声明说明符中应至少给出一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出。 每个类型说明符列表应为以下多个集合之一(用逗号分隔,每个项目有多个多集); 类型说明符可以按任何顺序出现,可能与其他声明说明符混合。

  • long longsigned long longlong 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声明

声明-符:
存储类说明符
声明说明符选择
type-specifier declaration-specifiers opt
type-qualifier声明 – 说明符opt
function-specifier declaration-specifiers opt
alignment-specifier declaration-specifiers opt

另外,正如奥拉夫在评论中指出的那样:

6.11.5存储类说明符

在声明中声明说明符开头之外的存储类说明符的放置是一个过时的function。

拆分整数类型关键字(类型说明符)也是古怪的。 宣言的更正统版本是:

 static _Thread_local _Atomic const volatile unsigned long long int x = 10; 

(或者它可能会掉落int )。