[英]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.