在类似的声明中
static int a, b, c;
static
是否适用于所有3个变量或仅第一个变量的定义?诸如volatile
或mutable
之类的其他关键字呢?
如果不同关键字的规则不同,那么有何不同?
例如,我知道const
是分布式的,但指针不是,例如
int * a, b;
与
相同int * a;
int b;
注意:我尝试使用const
(而不是static
)作为例子来问类似的问题,这被误解了。我想知道根据标准,所有适用关键字的常规规则是什么。
让我们这样说。在变量类型说明符由多个单词组成,然后由逗号分隔的变量列表组成的任何情况下,如何解析定义/声明?
答案 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;
[...]
- init-declarator-list 中的每个
- init-declarator 都只包含一个 declarator-id ,即该声明的名称。 em> init-declarator ,因此是声明所声明的名称之一。 decl-specifier-seq 中的 type-specifiers (7.1.5)和的递归 declarator 结构init-declarator 描述一种类型(8.3),然后与 init-declarator 声明的名称相关联。
(相对于“打字词”,该标准更喜欢使用“声明说明符”一词,但这涉及到同一件事。)
这表示所有类型说明符与每个声明符组合在一起,以形成要声明的每个名称的类型。类型说明符包括const
,volatile
,signed
,unsigned
以及所有基本类型(void
,int
,{{1} },...)和用户定义的wchar_t
,class
和enum
名称(请参见 [dcl.type] )。
类似的语言适用于存储类说明符,它们在中分别列出(typedef
,auto
,register
,static
,extern
) [dcl.stc] :
- [...] 存储类说明符适用于列表中每个 init-declarator 声明的名称,而不适用于其他说明符声明的任何名称。 [...]
类似地,对于mutable
,我们(在 [dcl.dcl] 中):
- 如果 decl-specifier-seq 包含
typedef
声明符,则该声明称为 typedef声明,并且每个的名称> init-declarator 被声明为 typedef-name ,与其关联类型(7.1.3)同义。 [...]
稍后,有关声明符( [dcl.decl] )的章节总结了一般原理:
声明的两个组成部分是说明符( decl-specifier-seq ; 7.1)和声明符( init-declarator-list) )。说明符指示要声明的对象,函数或typedef的类型,存储类或其他属性。声明符指定这些对象,函数或typedef的名称,并(可选)使用诸如
typedef
(指向)和*
(返回函数)之类的运算符来修改说明符的类型。 [...]声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样。
当前草案中的等效部分: