簡體   English   中英

編譯時的 sprintf 格式警告

[英]sprintf format warnings when compiling

變量freq聲明如下:

void exciteFreqN(float freq, unsigned short N)

然后我使用以下指令:

sprintf(debugstr, "Cntr ticks:%d freq:%1.1f\r\n", ctphp, freq);

freq的格式說明符"%1.1f"顯然是float的(我認為)。
但是,編譯器警告:

acquisitionXBEE.c: In function 'exciteFreqN':
***acquisitionXBEE.c:8519:5: warning: format '%1.1f' expects type 'double', but argument 4 has type 'float'

為什么"%1.1f"期望double "f"不應該代表浮動嗎?
我怎樣才能擺脫那個警告?

為什么 %1.1f 期望雙倍? “f”不應該代表浮動嗎? 我怎樣才能擺脫那個警告?

"%1.1f"需要 C 標准指定的double精度值。
在 C 中, double是 FP ... arguments 和常量的默認浮點類型。

...浮點類型的 arguments 在被傳遞之前被轉換為double float sprintf(debugstr, "%1.1f %1.1f %1.1f ", 1.0, 2.0f, freq); 應該管用。

想想"%f"暗示浮點的定點格式,而不是float

編譯器有問題或只是以這種方式設計,因此不符合 C。

演員表可能會消除警告:

sprintf(debugstr, "Cntr ticks:%d freq:%1.1f\r\n", ctphp, (double) freq);

報告錯誤和/或轉移到另一個編譯器。

注意:如果不兼容的編譯器在...參數時故意不將float提升為double ,則sprintf()可能支持作為擴展的某些標志,例如"%$f"以指示參數是float 檢查您的編譯器文檔。 然后要小心制作這種實現特定的代碼。


警告

即使在工作機器上sprintf(debugstr, "Cntr ticks:%d freq:%1.1f\r\n", ctphp, freq); 很可怕,因為緩沖區可能會FLT_MAX類的大freq而溢出。

控制寬度、大小並提供更多信息。 導致緩沖區溢出或信息量不大的調試消息有什么用?

// snprintf,       v----size-----v                      %g
snprintf(debugstr, sizeof debugstr, "Cntr ticks:%d freq:%g\r\n", ctphp, freq);
// ... or pedantically to see all useful precision
snprintf(debugstr, sizeof debugstr, "Cntr ticks:%d freq:%.*g\r\n", 
    ctphp, FLT_DECIMAL_DIG, freq);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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