【问题标题】:Pointer declaration C Standard指针声明 C 标准
【发布时间】:2021-11-19 12:48:01
【问题描述】:

有人可以向我解释一下来自 C 标准的以下引用吗?无论我多么努力地理解这一点,我都无法理解这一点,即使他们在 C 方面经验丰富,他们应该如何理解这一点?

C 2018 6.7.6.1 1 说:

如果在声明“T D1”中,D1 的形式为

    * type-qualifier-listoptD

并且在声明“T D”中为ident指定的类型是 “derived-declarator-type-list T”,然后是为 ident 指定的类型 是“derived-declarator-type-list type-qualifier-list 指向 T 的指针”。 对于列表中的每个类型限定符,ident 是一个如此限定的指针。

【问题讨论】:

  • I think I found a human language explanation of that. 您可以指定限定符,例如“const”,不仅用于指向的值,还可以用于指针本身。
  • 关于“即使有人在 C 方面经验丰富,应该如何理解这一点?”:您参加有限状态机课程(可能是离散数学计算机科学课程的一部分),然后解析理论,然后编译器构造。必须编写编译器(基本的大学项目级编译器)让您练习了解如何使用解析源文本来生成解释它的数据结构。 (这些课程应该是计算机科学学位的必修课,以确保学生即使不编写编译器也能理解编程语言语义。)

标签: standards


【解决方案1】:

首先考虑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 的形式为 * type-qualifier-listoptD”告诉我们考虑使用T *D 形式的声明。

下一个子句,“并且在声明 'T D' 中为 ident 指定的类型是 'derived-declarator-type-list T',”告诉我们考虑没有* 的T *D 会是什么,就好像它只是T D。现在,在D 内部,有一些标识符,称为ident。 D 可以只是 <i>ident</i>,也可以是数组声明符,如 <i>ident</i>[3],或函数声明符,<i>ident</i>(void),或另一个指针声明符,*<i>ident</i>,或它们的组合,包括重复。不管它是什么,T D 声明 ident 是某种东西。假设它将 ident 的类型声明为“derived-stuff T”。

那句话的最后一个子句,“那么为 ident 指定的类型是 'derived-declarator-type-list type-qualifier-list em> 指向 T' 的指针,告诉我们如果 T D 声明 ident 为“derived-stuff T”类型,然后T *D 将 ident 声明为“derived-stuff 指向T 的指针”类型。

带回限定词,最后一句告诉我们指定位置的任何限定词(const、restrict、volatile 和/或_Atomic 在* 和D 之间),适用于ident。

【讨论】:

  • @MichaelMunta:请参阅我对这个问题的评论。
  • 我认为这里的标准可能有错误。考虑int * const * foo;。这将 foo 声明为指向 int 的 const 指针的指针。但是问题中引用的最后一句话说 foo 是一个 const 限定指针。不是。
  • 我在这里遇到的问题是派生声明符类型列表 T。这在任何地方都没有定义,阅读标准无法推断出该子句的含义。
  • @MichaelMunta:“如果……并且在声明 'T D' 中为 ident 指定的类型是 'derived-declarator-type -list T'” 旨在定义它。它是一种模式匹配;有某种类型,例如“指向int 的指针数组”,并且该短语的意思是 derived-declarator-type-list 设置为匹配该“指针数组”。这类似于说“如果盒子的大小是 x 英寸”而不是“让 x 是盒子的大小,以英寸为单位”。 6.7.8 3 还使用 derived-declarator-type-list 并提到“derived-declarator-type-list 由 D的声明符指定>。”
  • 与盒子的类比是什么意思?
猜你喜欢
  • 2015-05-02
  • 2021-12-30
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2014-09-11
相关资源
最近更新 更多