为什么在 C99 之前禁止混合声明和代码?

2024-01-14

我最近成为一门大学课程的助教,该课程主要教授 C。该课程以 C90 为标准,主要归功于广泛的编译器支持。对于具有 Java 经验的 C 新手来说,非常令人困惑的概念之一是变量声明和代码不得混合在块(复合语句)中的规则。

这个限制最终在 C99 中被取消了,但我想知道:有人知道它最初为什么存在吗?它是否简化了变量范围分析?它是否允许程序员指定在程序执行的哪些点堆栈应该为新变量增长?

我认为如果语言设计者根本没有任何目的,就不会添加这样的限制。


在 C 语言的最初阶段,可用的内存和 CPU 资源是really稀缺。因此它必须以最小的内存需求快速编译。

因此,C 语言被设计为只需要一个非常简单且编译速度快的编译器。这又导致“单遍编译器 http://en.wikipedia.org/wiki/One-pass_compiler” 概念:编译器读取源文件并尽快将所有内容翻译为汇编代码 - 通常是在读取源文件时。例如:当编译器读取全局变量的定义时,立即发出适当的代码。

直到今天,这个特征在 C 中仍然可见:

  • C 要求所有内容的“前向声明”。多遍编译器可以自行前瞻并推断同一文件中函数的变量声明。
  • 这反过来又使得*.h必要的文件。
  • 编译函数时,必须尽快计算堆栈帧的布局 - 否则编译器必须对函数体进行多次传递。

如今,没有哪个严肃的 C 编译器仍然是“单遍”,因为许多重要的优化无法在一次内完成。更多内容可以在以下位置找到:维基百科 http://en.wikipedia.org/wiki/Compiler#One-pass_versus_multi-pass_compilers.

标准体徘徊了相当长的一段时间,以放松函数体的“单通”点。我认为其他事情更重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 C99 之前禁止混合声明和代码? 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • Vuejs:渲染后回调

    我有一个 Bootstrap 弹出窗口 我想将其附加到具有条件渲染的元素 因此 我必须在元素附加到 DOM 后触发 popover 有没有办法触发回调afterv if 语句将元素插入到 DOM 中 在 vuejs 2 中使用它 updat
  • 查找列表中 int 的索引

    有没有办法从列表中获取 int 的索引 寻找类似的东西list1 FindIndex 5 我想在列表中找到 5 的位置 Use the IndexOf 列表的方法 该方法的规范可以在MSDN http msdn microsoft com
  • Polars:在 read_csv 中一次指定所有列的数据类型

    In Polars https www pola rs 如何为中的所有列指定单一数据类型read csv 根据docs https pola rs github io polars py polars html reference api
  • Google 地图 API autocomplete.getPlace() 返回的几何图形不一致

    我在 AngularJS 应用程序中使用 GoogleMaps 自动完成功能 当我调用 autocomplete getPlace 当我尝试使用地方时 有一半的时间它说几何图形为空 一半的时间都有效 似乎无法弄清楚 我唯一的想法是我的代码在
  • 从 MCV2 视图中的模型集合中读取 DataAnnotations

    在我的 MVC2 AdminArea 中 我想为每个域模型创建一个概述表 我正在使用如下所示的 DataAnnotations 作为这些域模型对象的属性 DisplayName MyPropertyName public string Na
  • SQL 中聚合函数的除法行为不符合预期

    我正在尝试在 SQL Server 2008 R2 中做一些交叉表 这部分没问题 但是 如果我尝试获取每个单元格的百分比 我就会遇到问题 这是一个精炼的用例 一项调查 人们给出了他们最喜欢的颜色和最喜欢的水果 我想知道有多少人喜欢给定的水果
  • Strapi database.js / 多个数据库配置

    如果我在 database js 中运行 sqlite 则 Strapi 在本地工作 但如果我运行 postgres 则不行 我在网上发现我可以指定npm run develop使用 sqlite 生产应该使用 postgres 对于参考
  • 我的 iPhone 认为宽度为 980 像素

    我正在尝试创建一组三个很简单媒体查询来处理各种屏幕尺寸 经过一番绞尽脑汁之后 我得出了以下结论 media all and min width 0px and max width 480px styles here media all an
  • 在 WPF 中的标签 MouseHover 上显示按钮

    在我的应用程序中我有一个Startup Window其中包含 提示 信息等 窗口的一部分包含 3Labels左侧还有3个隐藏Buttons在右侧 我想要的是每当用户将鼠标悬停在其中之一上时Labels位于另一侧的按钮Label出现 我知道如
  • 动态添加时 Facebook 社交插件不显示

    我正在将 Facebook 社交插件添加到网页中 当我手动添加时 div class fb comments div 它可以工作 但是 当 javascript 代码添加它时 它不会 有任何想法吗 JS SDK 在初始化时会检查您的文档一次
  • Servlet 应用程序中的 Unicode 字符显示为问号

    最近我基于以下实现了国际化如何国际化 Java Web 应用程序 https stackoverflow com questions 4276061 how to internationalize a java web applicatio
  • RecyclerView.Adapter 中实现 getItemId() 的正确方法

    我有通用类 public abstract class BaseAdapter
  • jQuery:从另一个元素触发悬停事件

    当您将鼠标悬停在其中一个上时 div 我想要一个 a 也可以在页面的单独部分上 悬停 div class initiator div div a class Touch the div and I get hovered a div 我已经
  • 生成与 mysqldump 备份名称不同的数据库

    数据库 db 在 backup sql 中备份 有没有办法从与 db 名称不同的脚本恢复数据库 先感谢您 当然 当你导入它时 你会这样做 mysql uuser ppassword databasename lt mydump sql 你可
  • 使用 spring security 手动进行身份验证

    我正在使用 spring security 它工作正常 但现在我想手动启动安全过程 对我需要进入的客户端进行更改my控制器用户名和密码 表单不会直接调用 j spring security check 我想到了两种选择 我都遇到了一些问题
  • Rails:如何从 JSON 中提取值

    非常简单的问题 我是初学者 我有来自 fb 的 JSON 响应 其中包含名称和 ID name gt John Kline id gt 10276192 name gt Quinn Kumbers id gt 18093781 name g
  • 拟合sklearn GridSearchCV模型

    我正在尝试解决回归问题波士顿数据集 https www kaggle com c boston housing在 的帮助下随机森林回归器 https scikit learn org stable modules generated skl
  • 无法将 RDS 实例添加到 Elastic Beanstalk

    突然间 我无法将 RDS 添加到我的 EB 环境中 不知道为什么 这是完整的错误消息 无法检索 RDS 配置选项 配置验证异常 无效的选项值 db t1 micro 命名空间 aws rds dbinstance OptionName DB
  • 从超链接(来自 Internet)设置 WPF 图像源

    我尝试从 Internet 链接设置 WPF 图像源 我怎样才能做到这一点 我尝试过这个 但不起作用 Image image1 new Image BitmapImage bi3 new BitmapImage bi3 BeginInit
  • 为什么在 C99 之前禁止混合声明和代码?

    我最近成为一门大学课程的助教 该课程主要教授 C 该课程以 C90 为标准 主要归功于广泛的编译器支持 对于具有 Java 经验的 C 新手来说 非常令人困惑的概念之一是变量声明和代码不得混合在块 复合语句 中的规则 这个限制最终在 C99