C长型是多久?

nal*_*zok 18 c declaration variable-declaration language-lawyer

我知道标题似乎很愚蠢,但我认为值得一提.

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

_Thread_local long volatile static int _Atomic const long unsigned x = 10;
Run Code Online (Sandbox Code Playgroud)

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

所以我用这个问题咨询了N1570,只是更加困惑.它提到了一些术语,如" type-specifier "和" type-qualifier ",我long long在"类型说明符"中找不到,但long long在C中不是原始类型?有这么多书告诉我了!


澄清不重复:

是的,我看到了存在的问题与交易long int long,但这个问题有什么做预选赛,并且是C.

Jon*_*ler 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-specifiers:
     storage-class-specifier
     declaration-specifiers opt
     type-specifier declaration-specifiers opt
     type-qualifier declaration-specifiers 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;
Run Code Online (Sandbox Code Playgroud)

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

  • 从规范中略微翻译:声明的"类型"部分是一个单词列表,几乎是任意顺序; 重要的是每个单词出现多少次(这就是"multiset"部分).如果`long`出现两次,`int`出现一次或根本不出现,其余的是有效的(没有出现其他类型名称,没有冲突或无效的说明符等)你有一个`long long int`(如果`signed`或没有出现,如果出现`unsigned`则无符号).即使其他东西介于两者之间. (2认同)