找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5021|回复: 1

【C】在不同的平台使用各种printf来打印size_t类型

[复制链接]

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
发表于 2019-3-27 04:51:59 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
size_t类型在stddef.h里面被定义,用于表示“长度”。它在32位的机器上是一个32位的无符号整数类型,而在64位的机器上则是64位的无符号整数类型,很多时候使用起来都很方便,具备跨位数兼容的可移植性,而且不用担心速度问题(在32位机器上使用64位整数比使用32位整数慢一些),十分优雅。

但由于size_t的长度是随位数变化的,如何才能优雅地使用printf来打印它呢?对于GCC编译器,使用 %zu 就可以打印size_t类型的参数,或者用scanf来获取一个size_t类型的参数的值。但对于Visual Studio 2015以前(不包括2015)带的MSVC的各种printf则不支持%zu。对于这些版本,你应该使用 %Iu

由于各个平台的printf对于格式字符的定义略有差异,C99推出了inttypes.h标准库头文件标准。你可以使用PRI或者SCN开头的宏来设置你想要打印的东西,而且它具有一定的规律,一般都能被猜中。它给每一个stdint.h里面定义的xintyy_t类型的整数都给出了对应的PRI或SCN版本的宏,比如PRIi64可以用于int64_t的打印,PRIu32可以用于uint32_t的打印。看下例代码:
  1. #include<inttypes.h>
  2. #include<stdio.h>

  3. int main()
  4. {
  5.         int32_t a = 1234;
  6.         uint64_t b = 5678;
  7.         printf("a = %"PRIi32" and b = %"PRIu64".\n", a, b);
  8.         return 0;
  9. }
复制代码
会正确输出“a = 1234 and b = 5678.[换行]
”。

然而不幸的是,VS直到2012,都没有inttypes.h这个头文件,直到VS2013才加入它。而且用VS2017打开VS2012的工程也不能用,除非升级工程。此时我们可以从这个帖子里拿一份谷歌提供的针对MSVC的inttypes.h头文件。不过我觉得比起把它添加到自己的MSVC的includes里面,不如把它存为msc_inttypes.h然后放到自己的工程里面,再使用宏来判断是包含它还是包含<inttypes.h>比较好。

话说回来,inttypes.h里面并没有包含针对size_t的PRI和SCN的版本。虽说并不配套,但我还是想自己造一个“PRIsize_t”来用于打印size_t。至于为什么要这么做……我才会告诉你我喜欢把for循环的那个i定义为size_t或者ptrdiff_t。

所以我会在我的工程的配置头文件里加上这么一堆:
  1. #if defined(_MSC_VER)
  2. #  include"msc_inttypes.h"
  3. #  if _MSC_VER >= 1800
  4. #    define PRIsize_t "zu"
  5. #  else
  6. #    define PRIsize_t "Iu"
  7. #  endif
  8. #else
  9. #  include<inttypes.h>
  10. #  define PRIsize_t "zu"
  11. #endif
复制代码
并复制一份msc_inttypes.h进去。这份msc_inttypes.h我是不会去动它的了,所以就到处复制了。

作为对比,我的数学库mathutil则要做成一个单独的repository(注意不是resporitory),然后被别的库引用头文件和静态库。一方面我可以随时更新mathutil,只要既有接口不变动,基本上都是能兼容各种引用它的工程的,除非行为上变动很大。另一方面,静态库允许进行链接时间优化,可以避免很多优化上的问题。

参考资料:
https://en.cppreference.com/w/c/types/integer
https://devblogs.microsoft.com/c ... -in-vs2013-preview/
https://www.0xaa55.com/thread-25686-1-1.html
https://github.com/0xAA55/mathutil

本帖被以下淘专辑推荐:

回复

使用道具 举报

55

主题

271

回帖

9330

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8199 个
贡献
251 次
宅之契约
0 份
在线时间
253 小时
注册时间
2014-2-22
发表于 2019-3-27 05:30:52 | 显示全部楼层
我直接用%p
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-28 22:10 , Processed in 0.045327 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表