[英]Is there a printf specifier that requires float not double?
當我對帶有參數float
類型的參數的snprintf
使用“%f”說明符時,出現MISRA類型錯誤。
根據我的研究,MISRA是正確的,因為“%f”期望使用double
類型。
是否有浮點說明符或修飾符將使用float
類型參數而不是double
?
我正在嵌入式系統上工作,不想為了討好snprintf
函數而將32位float轉換為64位double
。 代碼將打印到調試/控制台端口,這是進行轉換的唯一位置。
對於那些需要代碼示例的人:
// 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編譯器。
否,因為printf
及其朋友是可變參數函數,所以float
參數會自動轉換為double
,這是默認參數提升的一部分 (請參閱C99標准的6.5.2.2節)。
我不知道為什么會觸發MISRA警告,但我想不出有什么危險的方法。
不,沒有,因為標准促銷在通過變量參數列表時將每個float
參數轉換為double
。
正確的MISRA-C:2004合規性分析應給出:
如果您收到上述錯誤以外的其他錯誤,則您的靜態分析儀可能已損壞。
我已經手動分析了LDRA Testbed 7.6.0。
由於自動升級,不可能在printf函數中指定float而不是double,但是我認為您可以從以下位置更改代碼:
(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", my_float);
至:
(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", (double)my_float);
並取得正確的結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.