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
).