簡體   English   中英

是否有一個需要float不加倍的printf說明符?

[英]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合規性分析應給出:

  • 違反1.1,代碼不符合ISO 9899:1990(C ++代碼,C99代碼)。
  • 違反2.2,使用//注釋。
  • 違反16.1,使用可變參數函數。
  • 違反20.9,使用stdio.h。

如果您收到上述錯誤以外的其他錯誤,則您的靜態分析儀可能已損壞。

我已經手動分析了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM