【发布时间】:2015-10-29 02:56:12
【问题描述】:
Looking at this answer 并知道0 is an octal constant:
对于十六进制[常量[和根据 cmets 的八进制]],它是值可以适合的第一种类型:
int、unsigned int、long、unsigned 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
0being 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