当我使用snprintf
的“%f”说明符且参数类型为float
时,我收到了MISRA类型错误。
根据我的研究,MISRA是正确的,因为“%f”出现了double
的类型。
是否有使用float
类型参数而不是double
的浮点说明符或修饰符?
我正在研究嵌入式系统,并且不想将32位浮点数转换为64位double
,只是为了取悦snprintf
函数。代码打印到调试/控制台端口,这是转换发生的唯一位置。
对于那些需要代码示例的人:
// This section is for those C++ purists and it fulfills the C++ tag.
#if __cplusplus
#include <cstdio>
#else
#include <stdio.h>
#endif
#define BUFFER_SIZE (128U)
int main(void)
{
char buffer[BUFFER_SIZE];
float my_float = 1.234F;
// The compiler will promote the single precision "my_float"
// to double precision before passing to snprintf.
(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", my_float);
puts(buffer);
return 0;
}
我对SO和Web的所有研究都是关于打印浮点值,而不是关于哪些说明符需要float
参数,以便不会向double
进行升级。
我正在为ARM7TDMI处理器使用IAR Embedded Workbench编译器。
答案 0 :(得分:20)
不,因为printf
及其朋友是可变函数,所以float
参数会自动转换为double
,作为默认参数促销的一部分(见C99标准第6.5.2.2节。
我不知道为什么这会引发MISRA警告,但我想不出有什么方法可能会有危险。
答案 1 :(得分:9)
不,没有,因为标准促销在通过变量参数列表时将每个float
参数转换为double
。
答案 2 :(得分:5)
正确的MISRA-C:2004年的合规分析应该给出:
如果您遇到上述错误,您的静态分析仪可能会损坏。
我已手动分析,以及LDRA Testbed 7.6.0。