技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 358|回复: 1
收起左侧

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

[复制链接]

1041

主题

2328

帖子

5万

积分

用户组: 管理员

一只技术宅

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

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

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

x
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的打印。看下例代码:
[C] 纯文本查看 复制代码
#include<inttypes.h>
#include<stdio.h>

int main()
{
	int32_t a = 1234;
	uint64_t b = 5678;
	printf("a = %"PRIi32" and b = %"PRIu64".\n", a, b);
	return 0;
}
会正确输出“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。

所以我会在我的工程的配置头文件里加上这么一堆:
[C] 纯文本查看 复制代码
#if defined(_MSC_VER)
#  include"msc_inttypes.h"
#  if _MSC_VER >= 1800
#    define PRIsize_t "zu"
#  else
#    define PRIsize_t "Iu"
#  endif
#else
#  include<inttypes.h>
#  define PRIsize_t "zu"
#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

本帖被以下淘专辑推荐:

36

主题

146

帖子

7189

积分

用户组: 管理员

UID
77
精华
11
威望
115 点
宅币
6626 个
贡献
132 次
宅之契约
0 份
在线时间
107 小时
注册时间
2014-2-22
发表于 2019-3-27 05:30:52 | 显示全部楼层
我直接用%p

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-8-21 22:27 , Processed in 0.102577 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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