声明者和直接声明者有什么区别?

Jos*_*inn 5 c syntax programming-languages declaration variable-declaration

在作者 Brian W. Kernighan 和 Dennis M. Ritchie 的《C 编程语言》第二版中,他们讨论了声明符直接声明符。讨论从本书的第 14 页开始。122 与dcldirect-dcl的 您能以易于理解的方式解释声明符和直接声明符之间的区别吗?是什么让它变得直接

另外,在第 225

其中直接声明符是标识符或带括号的标识符。特别是,它不能通过 typedef 实现函数类型。

在我看来,声明符是变量或函数的声明。在“TD”中,T部分指定其说明符和类型,D部分指定标识,表示变量或函数的唯一标识名称。这和语言的语法有一定的关系。

声明符是否是间接的,因为它们没有像direct-declarator中那样指定为直接的?

Eri*_*hil 2

该语法需要一个直接声明符标记来指定优先级。事实上,* foo [ 3 ]必须被解析为一个声明符*后跟一个直接声明符,即foo [ 3 ]。如果语法没有分隔声明符直接声明符,则可能不清楚 this*后面是foo [ 3 ]分组在一起还是* foo分组在一起后面是[ 3 ]

\n

语法说声明符是:

\n
    \n
  • 指针opt 直接声明符
  • \n
\n

其中指针后跟*可选限定符(如const),直接声明符是以下之一:

\n
    \n
  • 标识符
  • \n
  • ( 声明者 )
  • \n
  • 直接声明符 [ 类型限定符列表opt 赋值表达式opt ]
  • \n
  • 直接声明符 [ static 类型限定符列表选择 赋值表达式 ]
  • \n
  • 直接声明符 [ 类型限定符列表 static 赋值表达式 ]
  • \n
  • 直接声明符 [ 类型限定符列表opt *]
  • \n
  • 直接声明符 ( 参数类型列表 )
  • \n
  • 直接声明符 ( 标识符列表选项 )
  • \n
\n

因此,给定* foo [ 3 ],我们必须将其视为*for指针foo [ 3 ]for direct-declarator 的声明器。无法在直接声明符*的开头使用 has 。因此,必须声明一个包含 3 个指针的数组,而不是指向包含 3 个元素的数组的指针。* foo [ 3 ]

\n

如果声明符直接声明符的这些选项合并为单个语法标记,则解析将是不明确的。您可以将其解析为* foo [ 3 ]that* foo是一个声明符,后跟[ 3 ],这不是我们想要的。

\n

这个名字没有什么大的意义;我们只需要附加令牌的另一个名称。C 语法中还有其他这样的例子。值得注意的是,表达式语法以表达式开始,然后经历一系列赋值表达式条件表达式逻辑或表达式等。它们的名称与其所涉及的运算符相关联,直到到达primary-expression。这与direct-declarator有一些语义相似性,表明它们都是以 \xe2\x80\x9d 的精神命名的。好吧,我们到达了这个语法链的底部,这里是主要/直接标记。\xe2\x80\x9d

\n