首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MISRA C指令4.6

MISRA C指令4.6
EN

Stack Overflow用户
提问于 2020-05-09 16:23:18
回答 2查看 691关注 0票数 1

应该使用表示大小和符号的类型来代替基本的数字类型。

拜托你能帮帮我吗?为什么我的工具检测到对此代码的违反:

代码语言:javascript
运行
复制
typedef int int_t;

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2020-05-09 17:05:52

int的位宽取决于硬件体系结构(有时还取决于其他参数,如工具链的选择和配置)。该类型仅具有最小的位宽/值范围,但不需要具有某些确切的属性。

相反,类型int8_tint16_tint32_tint64_t及其对应的无符号对应(相同的类型名但带有u前缀)在stdint.h中定义,以提供确切的位宽/值范围--但将它们移植到不同的平台时,它们的使用效率仍然存在疑问。

在嵌入式系统中(特别是那些需要安全性、安全性和/或可用性的系统),主要关注的是对于给定的变量类型,每个平台都支持程序员期望的位宽(或者相反,每个程序员都承认所使用类型的限制)。因此,一个好的建议是从固定宽度类型开始,并且只有在优化是非常必要的和使用非固定宽度类型所引发的风险可以通过其他措施(在当时合法的米斯拉规则偏差)的情况下才使用其他类型。

票数 2
EN

Stack Overflow用户

发布于 2020-05-11 07:59:31

MISRA:2012支持C90和更高版本的标准。在现代C中,我们应该简单地使用stdint.h而不是typedef,所以我强烈建议这样做。精心设计自己的定制类型是一种糟糕的做法。

如果您使用的是C90,那么您需要制作与stdint.h中相同的类型。就像这样:

代码语言:javascript
运行
复制
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
  typedef unsigned char uint8_t;
  /* and so on... */
#else
  #include <stdint.h>
#endif

C90没有定义__STDC_VERSION__,C94把它定义为199409L,所以上面的宏涵盖了C99之前的所有内容。

上述需要放在一些项目范围内的通用标头中.

boolfalsetrue也做同样的事情,因为在C90中也没有stdbool.h

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61700035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档