【问题标题】:Does size_t foo = 0; need a cast?size_t foo = 0;需要演员吗?
【发布时间】:2015-10-29 02:56:12
【问题描述】:

Looking at this answer 并知道0 is an octal constant

对于十六进制[常量[和根据 cmets 的八进制]],它是值可以适合的第一种类型:intunsigned intlongunsigned long , long long, unsigned long long

因此,我推断这不需要演员表:

size_t foo = 0;

但是,由于严格的 MISRA-C lint 工具,我收到一条关于非法隐式类型转换的消息 - MISRA-C:2004 Rule 10.1。

是我的理解有误,还是工具有误?

(注意:我已更改为 size_t foo = 0U;,因为这比与 QA 争论要简单得多,但我想满足自己的好奇心。)

【问题讨论】:

  • 您如何定义“需要演员表”?有一个隐式转换,MISRA 会告诉你。
  • 另外,由于您标记了问题 C,而不是 C++,这里是 a question about 0 being octal in C
  • 十进制常量也不需要强制转换;任何算术类型都可以隐式转换为任何其他算术类型。但size_t foo = 0U; 也可能涉及隐式转换; 0U 属于unsigned int 类型,它可能与size_t 类型相同,也可能不同。 (如果 MISRA 需要演员表,那么 MISRA 就是愚蠢的。)
  • @AnT - MISRA C:2012 规则 10.3 明确允许 如果其值可以表示为基本上有符号类型的非负整数常量表达式,则可以将其分配给基本上无符号类型的对象那种类型,这是一种标准的方式,说你不需要 U :-)
  • IINM 甚至不可能便携式地写出 size_t 文字,因为 size_t 的全部意义在于为一种未知宽度的别名...

标签: c type-conversion misra


【解决方案1】:

我不确定您要达到什么目的,但是...

  • 0 是signed int 类型
  • 0U 是 unsigned int 类型

size_t 需要类型 size_t - 并且大小(通常)是无符号的

所以为了严格遵守size_t foo = 0U; 尽管使用size_t foo = (size_t)0; 可能更正确

顺便说一句,关于 0 是十进制、八进制还是其他任何值的讨论都无关紧要……它仍然是零。

--

编辑添加:

虽然在 MISRA C:2004 中已弃用有符号和无符号之间的显式转换(尽管这有很大的偏差),但对于 MISRA C:2012 规则 10.3 明确允许本质上为有符号类型的非负整数常量表达式可能是分配给本质上无符号类型的对象,如果它的值可以由该类型表示

这是一种标准的表达方式,你不需要 U

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-03-20
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多