计算函数返回值的最佳实践

2023-11-22

我经常用 C 语言构建函数来检查一些参数并返回错误代码。

当我发现错误时停止值检查的最佳方法是什么?

第一个例子:

ErrorCode_e myCheckFunction( some params )
{
  ErrorCode_e error = CHECK_FAILED;

  if( foo == bar )
  {
     if( foo_1 == bar_1 )
     {
        if( foo_2 == bar_2 )
        {
           error = CHECK_SUCCESS;
        }
     }
  }

  return error;
}

第二个例子:

ErrorCode_e myCheckFunction( some params )
{
  if( foo != bar )
  {
     return CHECK_FAILED;
  }

  if( foo_1 != bar_1 )
  {
     return CHECK_FAILED;
  }

  if( foo_2 != bar_2 )
  {
     return CHECK_SUCCESS;
  }
}

我更喜欢第一种方法,因为我读到 MISRA 规则避免使用多个 return 语句。

哪种方法是最好的?


第二种是最好的,因为它更容易阅读,随着复杂性的增加可以很好地扩展,并且在出现错误时立即停止执行该函数。当函数内部有大量错误处理时(例如,如果函数是解析器或协议解码器),这是编写此类函数的唯一明智的方法。

MISRA-C 不允许在函数中使用多个 return 语句,这是 MISRA-C 的缺陷。据说其目的是禁止从各处返回意大利面条代码,但教条地禁止多个 return 语句实际上会使代码的可读性大大降低,正如我们从您的示例中看到的那样。想象一下,如果您需要检查 10 个不同的错误。然后你就会有 10 个复合 if 语句,这将是一团难以阅读的混乱。

我已多次向 MISRA 委员会报告此缺陷,但他们没有听取。相反,MISRA-C 只是盲目引用 IEC 61508 作为规则的来源。反过来,它只列出了该规则的一个有问题的来源(IEC 61508:7 C.2.9),而且它是一本 1979 年的恐龙编程书。

这既不专业也不科学——MISRA-C 和 IEC 61508(以及 ISO 26262)都应该为(直接或间接)将 1979 年的主观废话列为其唯一来源和理由而感到羞耻。

只需使用第二种形式并针对此缺陷 MISRA 规则提出永久偏差。

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

计算函数返回值的最佳实践 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url

随机推荐

  • C 指针算术 sizeof(struct)

    这是有问题的代码 include
  • 在 DVCS 中维护 Changelog.txt 文件

    我正在开发一个使用大量分支的 git 项目 在大多数情况下 这是一个非常棒的工作流程 我很高兴在分支之间进行合并 喜欢能够挑选代码 以及 git 和其他 dvc 附带的整体生命周期 我有一个痛点 真的很痛 如何维护changelog txt
  • 在大型解决方案中编译 C# 项目时如何利用多核 CPU?

    据我所知 VS2008 MSBuild不支持C 项目的多线程编译 不知道VS2010是否支持 您知道有这样做的第三方产品或开源项目吗 确实是MSBuild确实支持多核 虽然它有点像黑客 有一些限制 更容易从命令行 同样 一些构建服务器 如果
  • Dotpeek重新编译反编译文件

    我如何重新编译我编辑的代码 或者用原来的文件替换并在dotpeek中另存为exe 我尝试重新编译编辑的文件并保存它 但我不能 如果您找到任何方法请分享 谢谢 右键单击 Assembly Explorer 窗格中打开的文件 然后选择 导出到项
  • 在联接表 JPA 2 中映射额外属性

    我正在尝试按照此链接建模这种关系http www javaworld com javaworld jw 01 2008 images datamodel gif 这是订单和产品之间通常的多对多关系 但我不知道如何在连接表中添加额外的列 En
  • 如何使用 C# 获取 Windows 上 chrome.exe 的路径?

    我想从我的自动化测试框架启动 chrome 以便我可以测试我的服务器端 ASP NET 代码 确定 chrome exe 在我的计算机上的位置的最佳方法是什么 当 Chrome 安装在计算机上时 它会安装ChromeHTML网址协议 您可以
  • 如何缩小 .git 文件夹

    我目前的基地总面积约为 200MB 但我的 git 文件夹有 5GB 的惊人大小 由于我将工作推送到外部服务器 因此我不需要任何大量的本地历史记录 如何缩小 git 文件夹以释放笔记本上的一些空间 我可以删除 30 天之前的所有更改吗 莱纳
  • C++ 中“(void) new”是什么意思?

    我一直在看 Qttutorial它使用了我以前从未见过的结构 void new QShortcut Qt Key Enter this SLOT fire void new QShortcut Qt Key Return this SLOT
  • 比较 groovy 中的版本字符串

    嘿 我创建了一个 Groovy 脚本 它将提取某些文件夹的版本号 然后我想比较版本号并选择最高的 我让脚本在 dir 文件夹中运行 然后获取以下格式的版本 02 2 02 01 所以我可以得到这样的东西 02 2 02 01 02 2 02
  • 用于 Python 的 MS Analysis Services OLAP API [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在寻找一种方法来连接到 MS Analysis Services OLAP 多维数据集 运行 MDX 查询并将结果提取到 Python 中 换句话说 这正是 Excel 所做
  • 如何配置我的 iPhone 项目以使用单独的应用程序图标进行测试版

    我想要实现的是 我发送给 Beta 测试人员的构建中的应用程序图标与将提交审批的应用程序图标不同 这将使我和我的 Beta 测试人员能够轻松识别该应用程序是 Beta 版本 我不确定是否应该添加构建脚本来修改 info plist 并更改其
  • 如何将 Swift 结构作为参数传递给 Objective-C 方法

    我有一个接受类型参数的 Objective C 方法id我想向它传递一个 Swift 结构 ObjcClass m file implementation ObjcClass void addListener id listener Do
  • 在自定义活动设计器中将数据绑定到组合框

    我有一个自定义活动 有一个参数是一个字符串 但是 我不想让设计者输入任意字符串 而是希望向设计者提供一个带有选项列表的组合框 这些选项是动态的 并且从数据库加载到 List 集合中 我的问题是我不知道如何将设计器中的组合框绑定到此列表并将选
  • 通过网络读取和解析大型文本文件的最佳方法是什么?

    我遇到一个问题 需要我解析远程计算机上的多个日志文件 有一些并发症 1 该文件可能正在使用中 2 文件可能很大 100mb 3 每个条目可以是多行 为了解决使用中的问题 我需要先复制它 我目前正在将其直接从远程计算机复制到本地计算机 并在那
  • 如何在Python中的散点图上绘制一条线?

    我有两个数据向量 并将它们放入pyplot scatter 现在我想对这些数据绘制线性拟合 我该怎么做 我尝试过使用scikitlearn and np polyfit import numpy as np from numpy polyn
  • 对具有原始数字返回类型的方法的反思

    我目前正在开发一个小型框架来收集 OSGi 系统中的指标 它的核心是注释 Metric 它指示服务的给定方法可以在被请求时提供度量 例如数值 这些方法看起来像 Metric public int getQueueSize or Metric
  • maven没有找到类

    我继承了一个巨大的maven java项目 但无法编译它 mvn compile 它告诉我它找不到一个类 即使它就在本地仓库中 Failed to execute goal org codehaus enunciate maven enun
  • 如何在 Ruby 中实现抽象类

    我知道 Ruby 中没有抽象类的概念 但如果需要实施的话 我该如何实施呢 我尝试过这样的事情 class A def self new raise Doh You are trying to write Java in Ruby end e
  • 从wcf服务返回html

    我有一个网络服务 我需要从中返回一个包含 html 的字符串 此 html 是 Select 控件的标记 用于 jqGrid 搜索过滤器 例如
  • 计算函数返回值的最佳实践

    我经常用 C 语言构建函数来检查一些参数并返回错误代码 当我发现错误时停止值检查的最佳方法是什么 第一个例子 ErrorCode e myCheckFunction some params ErrorCode e error CHECK F