問題如題目,在最近的工作中,使用 cppcheck
對代碼進行靜態檢查,遇到打印 size_t
類型以及其他類型的警告,再這裏記錄下。
本文提到的打印輸出,指的是 printf
函數或者 Format
函數中格式化的輸出。
各種數據類型的打印
先看 size_t
類型,應該要如何打印。如果用 %d
,會輸出如下警告:
嘗試使用 %u
、%lu
和 %llu
,都會有上述錯誤,這就很奇怪了,經過一番搜索,從這裏找到答案。
對 size_t
類型,既可以使用 %d
也可以使用 %zu
,使用後者,cppcheck
不會報移植可能性問題。這裏的 z
控制長度,u
表示無符號整形值。
size_t
在32位和64位下的定義不同:
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else /* _WIN64 */
typedef unsigned int size_t;
語言標準規定:sizeof(int) <= sizeof(long) <= sizeof(long long)
既然說到這裏,針對 無符號整形值、有符號整形值,要如何無警告地打印呢?
-
有符號整形值 int --》 %d
-
有符號整形值 long --》 %ld
-
有符號整形值 long long --》 %lld
-
無符號整形值 unsigned int --》 %u
-
無符號整形值 unsigned long --》 %lu
-
無符號整形值 unsigned long long --》 %llu
從上面可知,d
表示有符號,u
表示無符號,一個l
表示一個long
。
上面是語言基礎類型的打印,還有不同編譯器,自帶的標準庫定義的平臺無關類型,如上面的 size_t
、__int64
、_int64
`
細節注意
在打印同類變量時,要保證輸出格式一致性。如果是16進制輸出,那麼所有地方都要是16進制輸出,並且輸出前綴名稱要一致,這樣方便在日誌文件中搜索定位。
從使用者的角度去查看日誌信息,看各種打印信息的一致性、可搜索性、是否有助於問題定位。
參考鏈接