如何打印数值类型
问题如题目,在最近的工作中,使用 cppcheck 对代码进行静态检查,遇到打印 size_t 类型以及其他类型的警告,再这里记录下。
本文提到的打印输出,指的是 printf 函数或者 Format 函数中格式化的输出。
各种数据类型的打印
先看 size_t 类型,应该要如何打印。如果用 %d ,会输出如下警告:
尝试使用 %u、%lu和 %llu,都会有上述错误,这就很奇怪了,经过一番搜索,从这里找到答案。
对 size_t 类型,既可以使用 %d 也可以使用 %zu,使用后者,cppcheck不会报移植可能性问题。这里的 z 控制长度,u表示无符号整形值。
注意:%zu格式打印在 VS2010 上会报错,在VS2019上不会报错。还是建议用 %d 类型。
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进制输出,并且输出前缀名称要一致,这样方便在日志文件中搜索定位。
从使用者的角度去查看日志信息,看各种打印信息的一致性、可搜索性、是否有助于问题定位。
参考链接

浙公网安备 33010602011771号