【发布时间】:2019-03-23 00:47:05
【问题描述】:
MISRA-C:2004 规则 10.1 不允许隐式扩展 函数参数 或 返回表达式 的类型,如以下代码sn -p:
void foo1(int16_t x);
int16_t foo2(void)
{
int8_t s8a;
...
foo1(s8a); /* not compliant */
...
return s8a; /* not compliant */
}
但是,据我了解,它们与分配情况没有什么不同:
s16a = s8a; /* compliant */
有什么意义?谢谢。
【问题讨论】:
-
Rust 也有类似的限制,您需要显式强制转换(例如
let a: u16 = 3u8 as u16)。有很多关于这个的讨论,例如internals.rust-lang.org/t/… 。我还没有完整地阅读这个,但总结是,你不会在不知不觉中将不同的类型添加在一起,例如一个 u16 和一个 u8,因为结果可能令人惊讶。 -
我猜是 Misra-C:2004 规则 10.1
The value of an expression of integer type shall not be implicitly converted to a different underlying type if: [..] the expression is not constant and is a function argument [...]。但下面写的是它们的意思是不允许从更宽类型到更窄类型的转换,反之亦然。 -
您能否引用您所指的 MISRA C 规则,@dingcure ?
-
@Andrew 正如 Kamil Cuk 所指出的,这是 MISRA-C:2004 规则 10.1。
标签: c type-conversion misra