gpt4 book ai didi

c - 为什么旧的 C 语言规范要求预先声明函数局部变量?

转载 作者:太空狗 更新时间:2023-10-29 16:22:13 26 4
gpt4 key购买 nike

在 C 编程语言中,我使用过的所有语言修订版都在计算任何非声明性/赋值表达式之前强制执行预先变量声明。 C++ 似乎已经放弃了所有版本的这个要求。我也认识到更现代的 C 版本也放弃了这个要求,但我还没有使用任何这些标准。

我的问题是:阻止 C 语言自由声明而不是预先声明的历史原因是什么?

显然,从工程的角度来看,我想到了很多原因,但对我来说,没有一个特别合理。

  1. 防止发生模糊的编译器行为错误(例如无限解析循环、用于评估的大量内存膨胀,或宏的一些奇怪的极端情况。)
  2. 防止不希望的编译器输出。这可能是任何事情,从混淆调试过程的符号输出和调试工具的开发便利性,到意外的堆栈存储顺序。
  3. 可读性。我发现这也很难接受,因为 C 虽然与那个时代的其他语言相比是为了可读性而设计的,但几乎没有在其他任何地方强制使用这种类型的结构。 (除非您将原型(prototype)制作视为类似的执行,但如果我记得原型(prototype)是在 '89 规范中添加的。)
  4. 实现的复杂性和实际原因。这是我最倾向于相信的。作为工程师,我们必须做出某些考虑,以便在分配的时间范围内交付可行的产品。虽然我承认计算机科学和软件工程的专业前景都发生了巨大变化,但商业仍然是商业。最终,我确定 Bell 想要一个可用于 Unix 编程环境的成品,以展示他们取得的成就。

有没有人有任何好的资源支持以上任何内容?我完全错过了什么吗?我们可以从早到晚推测,但我正在寻找好的硬引用。

最佳答案

回顾早期(第 6 版 Unix,1975 年)C manual来自 Dennis Ritchie 的主页,在该版本中,函数局部变量可以在函数的开头声明:

The function-statement is just a compound statement which may have declarations at the start.

function-statement: { declaration-listopt statement-list }

declaration-list 未定义(遗漏),但可以很容易地假定具有语法:

declaration-list: declaration declaration-listopt.

不允许其他复合语句包含变量(或任何)声明。

这显然简化了实现;在早期的编译器源代码中c02.c函数头函数blkhed()只需要对auto变量声明使用的栈空间求和,同时记录它们的栈偏移量,并发出代码撞栈指针由适当的量。在函数退出时(通过 return 或从末尾掉下来),实现只需要恢复保存的堆栈指针。

K&R 认为有必要声明“变量声明(包括初始化)可以跟在引入任何复合语句的左大括号之后,而不仅仅是开始函数的语句”这一事实是一个提示那时候这是一个相对较新的功能。它还表明组合声明初始化语法也是最近的一个功能,事实上在 1975 年的手册声明器中不能有初始化器。

1975 年的手册第 11.1 节特别指出:

C is not a block-structured language; this may fairly be considered a defect.

block 语句和初始化声明 (K&R) 解决了该缺陷,混合声明和代码 (C99) 是逻辑延续。

关于c - 为什么旧的 C 语言规范要求预先声明函数局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com