C长型是多久?

时间:2016-02-15 03:24:42

标签: c language-lawyer declaration variable-declaration

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

以此声明(或定义,例如):

_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 questionlong int long的交易,但这个问题与限定符有关,并且在C中。

1 个答案:

答案 0 :(得分:17)

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

'正确位'包括:

  

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 longunsigned 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

此外,正如Olaf中的comment所述:

  

6.11.5存储类说明符

     

除声明开头之外的存储类说明符的位置   声明中的说明符是一个过时的功能。

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

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

(或者它可能会删除int)。