ANSI C 函数声明如何改进旧的 Kernighan 和 Ritchie 风格?

2024-04-07

关于 ANSI C 函数声明,这与旧的 K&R 风格有何改进?我知道它们之间的区别,我只是想知道使用旧样式会出现什么问题以及新样式是如何改进的。


旧式函数声明特别是,不允许对调用进行编译时检查。

例如:

int func(x, y)
char *x;
double y;
{
     /* ... */
}

...

func(10, 20);

当编译器看到调用时,它不知道函数参数的类型func,因此无法诊断错误。

相比之下:

int better_func(char *x, double y) {
    /* ... */
}

...

better_func(10, 20);

将导致编译器错误消息(或至少是警告)。

另一个改进:原型使得函数具有类型参数成为可能float,并且整数类型窄于int (the 3 char类型和两个short类型)。没有原型,float被提升为double,并且窄整数类型被提升为int or to unsigned int。有了原型,float参数作为float(除非函数是可变的,比如printf,在这种情况下,旧规则适用于可变参数)。

The C 基本原理 http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf文档在第 6.7.5.3 节中对此进行了讨论,可能比我的更好:

函数原型机制是最有用的补充之一 到C语言。当然,该功能在许多领域都有先例 过去 25 年源自 Algol 的语言。具体形式 标准中采用的内容很大程度上基于 C++。

函数原型提供了强大的翻译时错误 检测能力。在没有原型的传统 C 实践中, 译者很难发现错误(错误 参数的数量或类型)调用另一个中声明的函数 源文件。此类错误的检测发生在运行时 或通过使用辅助软件工具。

在不在函数原型范围内的函数调用中,整数 论点有整数促销应用和float参数被扩大到double。在这样的通话中这是不可能的 通过未转换的char or float争论。功能 原型让程序员可以明确地控制函数 参数类型转换,因此经常不合适和 有时,参数的默认扩展规则效率低下 被实施压制。

还有更多;去读吧。

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

ANSI C 函数声明如何改进旧的 Kernighan 和 Ritchie 风格? 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 我如何编写一个 SQL 查询来检查列是否为零,它将更新它,如果不是,它将移动到下一列?

    详细地说 我目前正在构建一个应用程序 让人们创建帐户并登录 他们提供的信息已保存到我的数据库中 我的数据库仅包含一张保存用户信息的表 每一行都是一个用户 这是一张可以让您更好地了解的图片 前六列包含用户信息 但是 在我的应用程序中 用户有一
  • Ruby:尝试获取哈希数组上的枚举器时,nil:NilClass 的未定义方法“[]”

    我正在尝试循环哈希数组 当我到达获取枚举器以开始循环的位置时 出现以下错误 undefined method for nil NilClass 我的代码如下所示 def extraireAttributs attributsParam cl
  • 如何使用 vim 的 :sh 命令来获取我的 bashrc?

    每当我使用 sh 在 vi m 中启动 shell 时 它都不会获取我的 bashrc 文件 我怎样才能让它自动执行此操作 See help shell http vimdoc sourceforge net htmldoc options
  • 期间发生内部错误:“更新 Maven 依赖项”

    每当我运行 eclipse 时 我都会收到以下消息 An internal error occurred during Updating Maven Dependencies Lorg codehaus plexus archiver ja
  • 快速向 AVPlayer 添加自定义控件

    我正在尝试创建一个表格视图 以便能够播放视频 我可以使用 AVPlayer 和图层来做到这一点 我想在视频视图底部添加带有滑块的自定义播放和暂停按钮 AVPlayerController 内置有这些控件 我如何在 AVPlayer 中实现这
  • 将报告 (RDLC) 设置为横向打印和 A4

    有没有办法将 RDLC 报告设置为始终横向并始终使用 A4 而无需每次通过打印对话框手动执行此操作 我已经在这个问题上呆了几个小时了 谷歌搜索后什么也没有出现 事实上 有没有办法跳过打印对话框本身 TIA 您当然可以避免打印对话框并直接打印
  • 使用 CursorAdapter 正确实现更改 ListView 数据

    我有一个通过 CursorAdapter 填充的 ListView 我让我的用户能够更改列表中的数据 例如 用户可以将一行标记为未读 数据是消息 假设我的用户将一行标记为未读 正确的实现是否会将数据库中的行标记为已读 然后重新查询游标 正确
  • 动态创建具有不同亮度的颜色

    我有一种颜色 我只在运行时知道 我想使用这种颜色创建两种新颜色 一种非常明亮 一种不明亮 为了澄清一下 假设我的颜色是红色 我想创建 浅红色 颜色和 深红色 颜色的十六进制值 我该怎么做呢 我的代码是使用 GWT 用 Ja va 编写的 将
  • Microsoft JScript 运行时错误:“jQuery”未定义

    我是 ASP MVC 3 菜鸟 正在学习音乐商店教程http www asp net mvc tutorials mvc music store mvc music store part 5 http www asp net mvc tut
  • 将 posixlt 作为新列添加到数据框中

    我正在创建一些随机数 data lt matrix runif 10 0 1 ncol 2 dataframe lt data frame data gt dataframe X1 X2 1 0 7981783 0 13233858 2 0
  • 事务范围的持久性上下文和扩展持久性上下文有什么区别?

    事务范围的持久性上下文和扩展持久性上下文有什么区别 差异在JSR 220 http jcp org aboutJava communityprocess final jsr220 index htmlEnterprise JavaBeans
  • Kubernetes 网络插件

    我已经使用 calico 网络插件安装了 3 个节点的 Kubernetes 集群 出于某种原因 我决定完全删除 kubernetes 并使用不同的网络插件重新安装它 Flannel 一切看起来都很好 直到我尝试部署我的第一个容器 kube
  • 尝试使用 unixODBC/FreeTDS 连接到 PHP 中的 MS SQL Server 时出现 iODBC 错误

    我正在尝试从 Mac 上的 PHP 连接到远程 MS SQL Server 数据库 最终在 Ubuntu 服务器上 使用 FreeTDS 和 unixODBC 但即使我似乎已正确设置所有内容 我仍收到 iODBC 错误 并且我 我不知道如何
  • 在 iOS 3.0 上运行 iOS4 内置的应用程序,为什么一切都很大?

    我的背景和图标都很大 就像放大了 2 倍一样 有什么想法吗 检查应用程序中的图像 应该有两组图像 其中一组为双分辨率且后缀为 2x 如果只有一组并且它们看起来很大 那么开发人员很可能从未打算在不运行 iOS4 的设备上运行该应用程序 这看起
  • Angularjs - ng-model 未定义

    我正在构建一个相当复杂的指令 其中我需要访问模板中特定元素上的 ng model 该元素包含在 ng if 指令中 我有一个plunker http plnkr co edit bQSIZE6gik36UkJkvTM0 p preview下
  • 如何在android中的ble中每5秒更新一次电池电量

    在下面的编码中 我得到了一定百分比的电池电量 但我想调用通知特性 以便每 5 到 10 秒更新一次电池百分比 所以请帮助我 以下是我的设备控制活动 在此我编码如下 private final BroadcastReceiver mGattU
  • 从列表中创建字典

    所以我创建了一个这样的列表 list line strip for line in open file txt r 这是我的清单的一个片段 1 2 2 3 2 3 4 3 1 3 4 5 4 2 1 4 4 8 3 5 2 5 7 15 1
  • Bokeh:鼠标移动或单击的 CustomJS 回调

    我想根据当前鼠标位置更新绘图数据 我的目标是这样的交互幂函数图 http bokeh pydata org en 0 10 0 docs user guide interaction html customjs for widgets 但不
  • ANSI C 函数声明如何改进旧的 Kernighan 和 Ritchie 风格?

    关于 ANSI C 函数声明 这与旧的 K R 风格有何改进 我知道它们之间的区别 我只是想知道使用旧样式会出现什么问题以及新样式是如何改进的 旧式函数声明特别是 不允许对调用进行编译时检查 例如 int func x y char x d