C++ 类型限定符出现在多项声明中(显示指针的奇怪行为)
当我尝试这样做时:C++ 类型限定符出现在多项声明中(显示指针的奇怪行为),c++,C++,当我尝试这样做时: int Var_1 =3, const Var_2 =34; 它抛出了一个错误,我理解(any)类型限定符const不能出现在多项声明(如上所述)的第一个逗号之后,但当用指针引发限定符时,它会改变其行为” 这有人能解释一下吗?< /P> < P>这与C++P>中声明C++的奇怪方式有关。 问题中所示的声明的一般结构如下:您有一个说明符序列,后跟一个或多个逗号分隔的声明符,其中每个声明符可能有一个可选的初始值设定项 关键字const和int是说明符,因此它们位于开头。每
int Var_1 =3, const Var_2 =34;
它抛出了一个错误,我理解(any)类型限定符const
不能出现在多项声明(如上所述)的第一个逗号之后,但当用指针引发限定符时,它会改变其行为”
这有人能解释一下吗?< /P> < P>这与C++P>中声明C++的奇怪方式有关。 问题中所示的声明的一般结构如下:您有一个说明符序列,后跟一个或多个逗号分隔的声明符,其中每个声明符可能有一个可选的初始值设定项
关键字const
和int
是说明符,因此它们位于开头。每个说明符修改所有声明符。例如:
const int *x, y[10];
在这个声明中有两个说明符,即const
和int
,还有两个说明符,即*x
和y[10]
。这两个说明符分别修改这两个说明符
说明符描述的类型信息只能出现在开头,因为所有说明符必须位于所有声明符之前。这是语言的规则
但是,一些类型信息由声明符携带。显然,x
和y
在上述声明中具有不同的类型,即使它们被相同的说明符修改;x
是指针类型,y
是数组类型。声明符可以被认为是由正在声明的实体,以及一些运算符。*
运算符创建指针,[]
运算符创建数组。这些运算符可以组合和嵌套,并且可以使用括号更改其优先级
我们可以将
*const Var_2
解释为一个声明符,将*const
视为一个生成const
限定指针的运算符。之所以需要这种语法,是因为const int*p
生成指向const int
的指针,而不是指向int
的const
指针。因此,const
在*const Var_2
中,它的作用不同于它在说明符中的作用,并且在语法上是允许的,因为它是*const
运算符的一部分。但是,const
本身不是可以出现在声明符中的有效运算符,当您将它放在逗号之后时,它就不能再作为说明符了。在不涉及太多细节的情况下,声明的语法是decl说明符seq,后跟init声明符list,后跟分号
在您的声明中,int
是decl说明符seq,Var1=3,*const Var_2=34
是初始声明器列表。后一个术语表示可能具有初始值设定项的声明器的逗号分隔列表
declarator的定义涉及它必须是以下之一:
- 括号中的另一个声明符
- 另一个声明符前面有可选属性和限定符,前面都有
、*
、&
或&&
T:*
- 另一个声明符,后跟各种限定符/属性等
- 标识符,可选后跟属性
Var1
是一个声明符,因为它是一个标识符。*const Var2
是第二个项目符号下的声明符。但是const Var2
与上述任何规则都不匹配
为什么规则是这样的?我不能确切地说,但我假设添加一个“限定符声明器”也是声明器的规则会带来一些问题,例如对当前有效的声明进行不明确的解析 例如
int-const x,y;
。如果const x
是一个声明符,那么可以用两种不同的方式来解析它——其中一种y
是一个int
,另一种y
aconst-int
<>但在实际的规则中,由于
const int *x, y[10];