【发布时间】:2016-05-05 00:01:30
【问题描述】:
我无法在当前标准中找到该短语的任何定义。有没有要不然怎么解释?
除了“声明”在英语中的含义外,它也在 C 语言中明确定义 - 有一整节关于它。
考虑一下这篇用英文写的帖子,没有任何隐藏的 C 含义(如果有任何由 C 标准定义的话)。
以这种方式思考这个问题 - 作为一个全新语言的问题。忘记你所知道的关于“C”的一切,然后试着只根据标准和应该阅读的方式来回答我的问题(你也可以帮助我)。
也许它在标准 ($2) 中引用的规范性参考文献中的某处进行了定义:
1 以下参考文件是必不可少的 本文件的应用。对于过时的参考文献,只有版本 引用适用。对于未注明日期的参考资料,最新版本的 参考文件(包括任何修改)适用。
2 ISO/IEC 2382−1:1993,信息技术 — 词汇 — 第 1 部分:基础 条款。
3 ISO 4217,用于表示货币和 资金。
4 ISO 8601,数据元素和交换格式——信息 交换——日期和时间的表示。
5 ISO/IEC 10646, 信息技术——通用编码字符集 (UCS)。
6 国际电工委员会 60559:1989,微处理器的二进制浮点运算 系统(以前指定为 IEC 559:1989)。
7 ISO 80000−2, 数量和单位 - 第 2 部分:数学符号和符号 用于自然科学和技术。
更具体地说,这个问题旨在成为另一个问题的前传 - 关于类型名称。目前它们的含义没有具体说明。只有它们的语法被认为与省略标识符的声明相同(尽管目前它们有一个不同的语法部分)。
所以当我们最终弄清楚“声明”的含义时,我们将能够理解应该如何阅读这样的代码:
void func(struct { int _1, _2; } );
int main()
{
func((struct { int _1, _2; }){2, 3});
}
因为这个复合文字是否被认为是一个不包含标签的结构的声明?这是哪里说的?
据我所见 - 无处。
另一方面,复合文字本身包含 type-name。
$6.5.2.5 (p3):
由括号括起来的类型名称组成的后缀表达式 后跟一个括号括起来的初始化器列表是一个复合 文字。它提供了一个未命名的对象,其值由 初始化列表。
如果我们应用常识,类型名称是没有标识符的声明,并且“x 的声明”意味着引入具有特定类型 x 的标识符的声明,那么一切都很好。但是类型名真的是声明吗?
是的,类型名称语法是没有标识符的声明,但这是关于它们的语法,仅此而已。它们仍然是不同的实体 - 类型名称(而不是声明)。引用 6.7.7 (p2):
在几种情况下,有必要指定一个类型。这是 使用类型名称完成,在语法上是一个声明 用于省略标识符的该类型的函数或对象。
综上所述,这两种类型 - 复合文字中的函数参数和类型名称相同吗?
记住(从标准)$6.7.2.3(p5):
结构、联合或枚举类型的两个声明 不同的范围或使用不同的标签声明不同的类型。 每个 结构、联合或枚举类型的声明 包含一个标签声明了一个不同的类型。
这就是我要问的,但后来我看到论文中的任何地方都没有明确指定“声明”的含义,我想知道它到底是什么意思。
我开始把这个 ANSI 标准看成一团糟,没人愿意详细解释。
【问题讨论】:
-
您没有正确搜索。
-
好吧,我确实搜索了一段时间,但也许我错过了一些东西。也许你可以帮助我。
-
你可以从这里开始:Google search of
C "declaration of". -
我宁愿根据标准论文寻找解释。
-
当我们考虑 c 语言的本质以及它的标识符是如何出现的时候,我认为这是一个很好的问题;似乎我们不知何故忘记了这种美丽语言的根源。随着时间的推移,这似乎在大多数人类语言中都会发生。
标签: c language-lawyer