是否为逗号分隔的变量定义分发了所有关键字?

时间:2019-04-21 21:09:20

标签: c++ declaration

在类似的声明中

static int a, b, c;

static是否适用于所有3个变量或仅第一个变量的定义?诸如volatilemutable之类的其他关键字呢?

如果不同关键字的规则不同,那么有何不同?

例如,我知道const是分布式的,但指针不是,例如

int * a, b;

相同
int * a;
int   b;

注意:我尝试使用const(而不是static)作为例子来问类似的问题,这被误解了。我想知道根据标准,所有适用关键字的常规规则是什么。

让我们这样说。在变量类型说明符由多个单词组成,然后由逗号分隔的变量列表组成的任何情况下,如何解析定义/声明?

1 个答案:

答案 0 :(得分:3)

所有最初的有类型的单词都适用于所有变量,或更确切地说,适用于声明符。声明符是声明中使用的伪表达式。

例如:

static int volatile long a, b[10], *&c, *(*const d)(float);
//^^^^^^^^^^^^^^^^^^^^^^
// typey words

//                       ^  ^^^^^  ^^^  ^^^^^^^^^^^^^^^^^^
//                       4 declarators

这里

  • a是一个静态易失的long int
  • b是易失的long int的静态数组[10]
  • c是指向volatile long int指针的静态引用
  • d是指向函数的静态const指针(采用浮点型),该指针返回指向易失long long int的指针

(此外,首字母单词的顺序无关紧要。)


参考文献:

在C ++ 98(ISO / IEC 14882:1998)中(我知道这已经过时了,但是从那以后该语言的这一部分就没有发生根本变化),我们(全部是我的):

[dcl.dcl] 中:

  

简单声明:
  decl-specifier-seq opt init-declarator-list opt
;

[...]

  
      
  1. init-declarator-list 中的每个
  2. init-declarator 都只包含一个 declarator-id ,即该声明的名称。 em> init-declarator ,因此是声明所声明的名称之一。 decl-specifier-seq 中的 type-specifiers (7.1.5)和的递归 declarator 结构init-declarator 描述一种类型(8.3),然后与 init-declarator 声明的名称相关联。
  3.   

(相对于“打字词”,该标准更喜欢使用“声明说明符”一词,但这涉及到同一件事。)

这表示所有类型说明符与每个声明符组合在一起,以形成要声明的每个名称的类型。类型说明符包括constvolatilesignedunsigned以及所有基本类型(voidint,{{1} },...)和用户定义的wchar_tclassenum名称(请参见 [dcl.type] )。

类似的语言适用于存储类说明符,它们在中分别列出(typedefautoregisterstaticextern) [dcl.stc]

  
      
  1. [...] 存储类说明符适用于列表中每个 init-declarator 声明的名称,而不适用于其他说明符声明的任何名称。 [...]
  2.   

类似地,对于mutable,我们(在 [dcl.dcl] 中):

  
      
  1. 如果 decl-specifier-seq 包含typedef声明符,则该声明称为 typedef声明,并且每个的名称> init-declarator 被声明为 typedef-name ,与其关联类型(7.1.3)同义。 [...]
  2.   

稍后,有关声明符( [dcl.decl] )的章节总结了一般原理:

  
      
  1. 声明的两个组成部分是说明符( decl-specifier-seq ; 7.1)和声明符( init-declarator-list) )。说明符指示要声明的对象,函数或typedef的类型,存储类或其他属性。声明符指定这些对象,函数或typedef的名称,并(可选)使用诸如typedef(指向)和*(返回函数)之类的运算符来修改说明符的类型。 [...]

  2.   
  3. 声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样。

  4.   

当前草案中的等效部分: