有人可以向我解释以下来自 C 标准的话吗?无论我如何试图理解这一点,我都无法理解这一点,即使某人在 C 方面经验丰富,也应该如何理解这一点?
C 2018 6.7.6.1 1 说:
如果在声明">TD1"中,D1的形式为
* 类型限定符列表 选项 D
声明">T D"中为ident指定的类型为 ">派生声明器类型列表T",则为ident指定的类型是">派生声明符类型列表类型限定符列表指向T"。 对于列表中的每个类型限定符,ident都是一个限定指针。
首先考虑T D
声明D
中的标识符是派生自T
的某种类型。可能没有添加任何内容;int foo
宣布foo
是int
。或者,声明符D
可能包含括号[…]
以便添加"数组",或者可能包含括号,以便添加"函数返回",或者可能包含星号,因此添加"指针",或者它可能具有这些组合(包括可能的重复)。所询问的文本说,插入*
以使T D
T *D
通过在T
之前插入"指针"来更改声明。例如,将int foo(void)
更改为int *foo(void)
会将类型从"函数返回int
"更改为"函数返回指向int
的指针"。
这是更详细的分析。
暂时忽略限定符,子句"如果在声明'T D1'中,D1具有形式 *类型限定符列表optD"告诉我们考虑形式为T *D
的声明。
下一句,"声明'TD'中为标识指定的类型是'派生声明器类型列表T'",告诉我们考虑没有*
T *D
会是什么,就好像它只是T D
一样。现在,在D
内部,有一些标识符,称为ident。D
可以是ident
,也可以是数组声明符,如ident[3]
,或者函数声明符,ident(void)
,或者另一个指针声明符,*ident
,或这些的组合,包括重复。不管它是什么,T D
都宣称身份是某种东西。假设它声明的标识类型为">派生的东西T
"。
该句子的最后一句,"那么为 ident 指定的类型是'派生声明器类型列表类型限定符列表指针指向T'",告诉我们,如果T D
声明 ident 的类型是"派生的东西T
",那么T *D
声明ident的类型是">派生的东西指向T
"。 回到限定词,最后一句告诉我们指定位置的任何限定词(const
、restrict
、volatile
和/或*
和D
之间的_Atomic
)都适用于标识。