Misra 规则 19.7:类似宏的函数

2023-11-29

我有一个关于 Misra 规则 19.7 的警告:在下面的行中,应该优先使用函数而不是类似函数的宏:

#define gOFFSETOF(type, mem) (gOFFSET)((size_t) ((char *)&((type *) 0)->mem - (char *)((type *) 0)))

我应该如何解决这个问题?


规则 19.7(建议):应优先使用函数而不是类似函数的宏。虽然宏可以提供比函数更快的速度优势,但函数提供了更安全、更健壮的机制。对于参数的类型检查以及类函数宏可能多次评估参数的问题尤其如此。

该规则是建议性的,因此这意味着“通常应该遵循”:

请注意,“建议”状态并不意味着可以忽略这些项目,而是应在合理可行的范围内遵循它们。正式的偏差对于咨询规则来说不是必需的,但如果认为合适的话可以提出。

因此,您可以选择打破规则,而无需做出正式的偏离。

现在,在回答您的问题“我应该如何解决这个问题?”时,鉴于此宏函数无法作为函数实现,您有两种选择。

选项 1:偏离规则 19.7

该公告明确指出函数比宏函数更好,并引用了C 《陷阱与陷阱》,Andrew Koenig (1988)将宏函数与函数进行比较,但将其描述为一种偏好,特别是相对于为“速度优势”而设计的短宏函数。

如果您相信这个宏使代码更清晰、更简洁,并且您已经适当地避免了宏函数的常见陷阱,那么您可以偏离规则 19.7,而不会造成正式的特定偏差,也不会违反规定。

选项2:删除宏功能

如果在考虑建议后您认为合适,则删除宏功能。您可能想要编写更多函数来分解额外的内联代码,和/或避免不必要的代码重复。

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

Misra 规则 19.7:类似宏的函数 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • EF 上的数据库连接错误

    我对实体框架非常陌生 我在编写基于 Web api 的网站 连接到 mssql 时遇到问题 我不断收到看似随机的错误 大部分似乎与数据库相关 这些错误最常在网站首次发布时发生 但有时也会在距上次发布数小时后发生 错误的选择 无效操作 连接已
  • 如何使用警报管理器重复我的服务?

    我做了一个基于位置的应用程序 现在我需要每 30 分钟运行一次定位服务 为此 我尝试使用警报管理器 但它只运行我的服务一次 我需要它每 30 分钟运行一次吗 My code gps back process java public clas
  • C# 转换整个数组?

    我看到这个Array ConvertAll方法 但是需要一个Converter作为一个论点 当我已经在类中定义了一个隐式转换器时 我不明白为什么需要一个转换器 public static implicit operator Vec2 Poi
  • C++:如何添加外部库

    我正在尝试将 SVL 添加到我的项目中 如果没有它 我会收到数百个错误 未定义的参考 添加 lSVL 后 所有错误都消失了 但 gcc 说 找不到 lSVL 其他一切 SDL SDL TTF SDL Mixer 都工作正常 您应该告知 gc
  • JQuery UI Draggable如何获取拖动开始位置

    我可以拖动我的可拖动项目并将它们放在我的可放置物品上 并从中获取放置位置 ui absolutePosition 发生在放置事件上 我需要知道拖动从哪个位置开始 我尝试在拖动开始事件上获取 ui position 但这是空的 我也尝试过 拖
  • 在 Google Apps 脚本中创建动态下拉列表[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想使用 Google Apps 脚本动态更改 Google 电子表格的单元格验证功能中候选列表的值 我需要从其他电子表格中获取值 如果我理解正确的话 这是我一直在努力解决的问题
  • Visual Studio代码nodejs请求“启动”:无法启动目标(原因:生成节点ENOENT)

    当我使用 Visual Studio 代码调试 NodeJS 应用程序时 视觉工作室代码告诉我request launch cannot launch target reason spawn node ENOENT 我的nodejs版本是4
  • 使用循环 onclick 更改背景颜色

    这是我的 js 小提琴 http jsfiddle net pYM38 16 var box document getElementById box var colors purple yellow orange brown black b
  • 确定 Android 设备是否以编程方式 root? [复制]

    这个问题在这里已经有答案了 可能的重复 确定是否在已取得 root 权限的设备上运行 如何 以编程方式 确定 Android 设备是否 已 root 运行软件或 ROM 的破解副本 我的数据库中有一些敏感信息 我想在手机 root 后 即用
  • SSKeychain 不保留数据

    我在用SSKeychain用于存储设备的UUID 然而 有时SSKeychain不保留 UUID 因此我的应用程序必须重新创建新的 UUID 有人可以告诉我一些原因吗SSKeychain不保留数据 提前致谢 对不起我的英语不好 在 Obje
  • SmartGit:文件或目录不是过期错误消息吗?

    有人请帮助我理解我对下面发生的事情的错误 误解 这是一个 SVN 存储库 正如您所看到的 我有两个分支并对版本进行了一些独立的更改 根据上面的日志 两个服务器分支都映射回当前本地发布分支 该分支提前了一些提交 如果我去将发布的更改推送回远程
  • 组合 SQL Server 查询

    我正在使用 SQL Server 并且有两个表 我想将其合并为一个查询 以用于填充网格视图 表1 dbo 工作UID PK 整数 Tech Ticket 整数 RMA Ticket 整数 区域 nchar10 已完成 nchar10 FA
  • 如何在 Rust 中将 Future 的生命周期绑定到 fn 参数

    我想写一个简单的run transactionRust MongoDB 驱动程序的函数 该函数尝试通过 mongo db 客户端执行事务 并在遇到可重试错误时重试该事务 这是该函数的最小可重现示例 use mongodb Client Co
  • 在 XNA 中,处理我不再需要的纹理的最佳方法是什么?

    我开始了一个项目 其概念是在整个游戏中连续重用相同的texture2d对象 定期重新加载新纹理 随着时间的推移 这被证明是一个坏主意 因为我遇到了 System OutOfMemoryException bool loadImages st
  • 从对象获取值并将其推入数组 javascript

    我想从对象中获取值并将其保存到数组中 这就是我的对象的结构 0 name John Deo age 45 gender male 1 name Mary Jeo age 54 gender female 2 name Saly Meo ag
  • 如何使用 fgetcsv 在 while 循环中跳过标题行?

    我无法像我之前使用的代码那样获得我编写的跳过第一行 标题 的新代码 见底部 我没有收到任何错误 但只是无法让它省略第一行 file fopen uploadcsv r column headers array row count 0 whi
  • 带过滤器的列表视图在隐藏键盘或按下回车键之前不会刷新

    我有一个显示联系人列表的列表视图 我在列表视图上方的布局中添加了一个 EditText 以便我可以使用过滤器进行搜索 我已经在 EditText 上使用 onTextChanged Listener 实现了这一点 我的列表视图适配器是一个自
  • 所有动画执行速度都很慢

    我不确定动画过程发生了什么 突然我的所有动画都执行缓慢 我已经重置了我的Simulator 重新启动我的Mac 但没有帮助 我不确定我做了什么或者这是系统问题 请检查下图 每个动画都在缓慢执行 我在用着Xcode7 3 1 Simulato
  • 如何设置连接属性(包括同义词)

    我在 Spring Boot 中的数据库配置是使用 yaml 文件完成的 Common spring jpa properties hibernate show sql true use sql comments truecat forma
  • Misra 规则 19.7:类似宏的函数

    我有一个关于 Misra 规则 19 7 的警告 在下面的行中 应该优先使用函数而不是类似函数的宏 define gOFFSETOF type mem gOFFSET size t char type 0 gt mem char type