Eri*_*hil 12 c language-lawyer
C 2018 6.7.6.1 1 说:
\n\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
这个问题是关于最后一句话的,但是让\xe2\x80\x99s先解决第一句话。
\n考虑一下声明int * const * foo。这里T是int,D1是* const * foo,类型限定符列表是const,D是* foo。
那么TD是int * 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)
将它们代入第一句的最后子句告诉我们T D1指定的类型foo是 \xe2\x80\x9cpointer ,const指向int\xe2\x80\x9d 的指针。到目前为止还好。
但最后一句告诉我们,对于列表中的每个类型限定符(即const),ident是一个如此限定的指针。所以它说foo是一个const指针。
但事实并非如此;我们通常将其解释int * const * foo为声明为指向 的指针的foo非const指针。constint
这是标准中的错误还是对最终句子有其他解释?
\n根据记录,有 3 个答案已被其作者删除,这支持了 C 标准的这一方面很棘手的结论。我不认为其他当前答案将示例源文本 ( int * const * foo) 与标准段落中的符号(T、D1、type-qualifier-list等)正确匹配。
因此我得出结论,这确实是标准中的一个错误。
\n我相信修复方法只是删除最后一句,\xe2\x80\x9c对于列表中的每个类型限定符,ident是一个如此限定的指针。\xe2\x80\x9d类型限定符列表中的任何限定符都已合并,正确地,进入前一句,并且D中的任何限定符都已合并到该声明符中。所以这看起来只是一个多余的句子,可能是在某些编辑中无意中出现的。
\n