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 风格? 的相关文章

  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • 什么是具有副作用的表达式?为什么不应将它们传递给宏?

    我在 C 如何编程 一书中看到这样一句话 具有副作用 即变量值被修改 的表达式不应传递给宏 因为宏参数可能会被多次求值 我的问题是什么是具有副作用的表达式以及为什么不应将它们传递给宏 经典的例子是计算两个值的最大值的宏 define MAX
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • Java 相当于 C# 的 async/await?

    我是一名普通的 C 开发人员 但偶尔也会使用 Java 开发应用程序 我想知道 Java 中是否有相当于 C async await 的东西 简单来说 java 相当于 async Task
  • 在 C 的公共 API 函数中使用枚举参数是个好主意吗?

    我正在设计一个 C API 其中必须提供一种设置一些双值选项的方法 为了识别选项 我使用以下枚举 typedef enum OptionA OptionB Option 使用是一个好主意吗Option作为公共 API 函数中的参数类型 in
  • 如何使用 LINQ 对列表的列表进行分组(例如:List>)

    我知道我可以使用一些 for 循环轻松地做到这一点 但想看看是否有一种方法可以使用流畅的 LINQ 来做到这一点 我试图找出每个子列表中有多少个 我在看Enumerable SequenceEqual http msdn microsoft
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • Visual Studio:同时调试多个项目?

    是否可以在 Visual Studio 中同时调试多个项目 我知道您可以从解决方案属性中选择多个启动项目 但是断点是如何处理的 如果两个项目使用同一个类 它的两个不同实例 并且我因其中的断点而停止 那么它只会阻止一个程序还是同时阻止两个程序
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 找到两个值的平均值的正确方法是什么?

    我最近了解到整数溢出是 C 中的未定义行为 附带问题 C 中也是 UB 吗 在 C 编程中 您通常需要求两个值的平均值a and b 然而做 a b 2可能会导致溢出和未定义的行为 所以我的问题是 找到两个值的平均值的正确方法是什么a an
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 黑屏只是闪烁一会儿

    在我的 Windows Phone 8 应用程序中 我有一个搜索页面 其中有一个文本框供用户输入搜索关键字 输入默认SIP键盘的 Enter 键时将调用搜索 搜索结果显示在另一个页面中 为了在导航到结果页面之前隐藏键盘 我使用 this F
  • MSVC如何在编译期间输出一些内容到“输出”窗口

    有时我看到某些项目在编译期间向输出写入一些内容 在MSVC 中如何实现 thanks use pragma message e g define MESSAGE t message FILE STRINGXXX LINE t define
  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • 防止使用不完整类型实例化模板类

    我正在写一个库 它的布局看起来类似于 A h include
  • 我的 Visual Studio 2008 模板有什么问题?

    我正在尝试为 Visual Studio 创建自己的类模板 称为 公共类 我跟着有关如何手动创建项目模板的官方 MSDN 说明 http msdn microsoft com en us library ms247113 aspx几乎一字不
  • 如何将curlpp 添加到我的项目中?

    我正在尝试从 vb net 过渡到 C 但我陷入了困境 我从下载了curpp这给了我一个 dll exp 和 lib 文件 我将包含这 3 个文件的目录添加到项目属性中的 附加库目录 链接器 gt 常规 接下来 我将 ws2 32 lib
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望

随机推荐

  • 展开方案中的函数

    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