C 标准中对指针声明符的描述是否有错误?

Eri*_*hil 12 c language-lawyer

C 2018 6.7.6.1 1 说:

\n
\n

如果在声明 \xe2\x80\x9c T D1 \xe2\x80\x9d 中,D1具有以下形式

\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 * 类型限定符列表opt D

\n

并且在声明 \xe2\x80\x9c T D \xe2\x80\x9d 中为ident指定的类型为\n\xe2\x80\x9c派生声明符类型列表T \xe2\x80\x9d,则指定的类型对于ident \nis \xe2\x80\x9c派生声明符类型列表类型限定符列表指向T \xe2\x80\x9d 的指针。\n对于列表中的每个类型限定符,ident是一个 so-qualified 指针。

\n
\n

这个问题是关于最后一句话的,但是让\xe2\x80\x99s先解决第一句话。

\n

考虑一下声明int * const * foo。这里TintD1* const * foo类型限定符列表constD* foo

\n

那么TDint * foo,并且指定 \xe2\x80\x9c 指向int\xe2\x80\x9d 的指针作为ident foo,因此导出声明符类型列表是 \xe2\x80\x9c 指向 \xe2\x80\x9d 的指针。(标准中没有对派生声明符类型列表typedef的公开解释,但 6.7.8 3 在讨论 时说它由D的声明符指定 \xe2\x80\x9cis 。\xe2\x80\x9d)

\n

将它们代入第一句的最后子句告诉我们T D1指定的类型foo是 \xe2\x80\x9cpointer ,const指向int\xe2\x80\x9d 的指针。到目前为止还好。

\n

但最后一句告诉我们,对于列表中的每个类型限定符(即const),ident是一个如此限定的指针。所以它说foo是一个const指针。

\n

但事实并非如此;我们通常将其解释int * const * foo为声明为指向 的指针的fooconst指针。constint

\n

这是标准中的错误还是对最终句子有其他解释?

\n

Eri*_*hil 0

根据记录,有 3 个答案已被其作者删除,这支持了 C 标准的这一方面很棘手的结论。我不认为其他当前答案将示例源文本 ( int * const * foo) 与标准段落中的符号(TD1type-qualifier-list等)正确匹配。

\n

因此我得出结论,这确实是标准中的一个错误。

\n

我相信修复方法只是删除最后一句,\xe2\x80\x9c对于列表中的每个类型限定符,ident是一个如此限定的指针。\xe2\x80\x9d类型限定符列表中的任何限定符都已合并,正确地,进入前一句,并且D中的任何限定符都已合并到该声明符中。所以这看起来只是一个多余的句子,可能是在某些编辑中无意中出现的。

\n