寻求有关使用的说明"zd"
with printf()
.
当然,对于 C99 及更高版本,以下内容是正确的。
void print_size(size_t sz) {
printf("%zu\n", sz);
}
C 规范seems允许printf("%zd\n", sz)
取决于它的阅读方式:
7.21.6.1fprintf
功能
z
指定以下d
, i
, o
, u
, x
, or X
转换说明符适用于size_t
或相应的有符号整数类型参数;或者以下n
转换说明符适用于指向对应于有符号整数类型的指针size_t
争论。 C11dr §7.21.6.1 7
这应该被理解为
- "
z
指定以下d
...转换说明符适用于size_t
或相应的有符号整数类型参数...“(两种类型)和”z
指定以下u
...转换说明符适用于size_t
或相应的有符号整数类型参数...”(两种类型)
OR
- "
z
指定以下d
...转换说明符适用于相应的有符号整数类型参数..."(仅限有符号类型)和"z
指定以下u
...转换说明符适用于size_t
“(仅限无符号类型)。
我一直在使用#2 定义,但现在不太确定。
哪个是正确的,1、2 还是其他?
如果 #2 是正确的,那么可以使用的类型示例是什么"%zd"
?
printf
with a "%zd"
格式需要一个与无符号类型对应的有符号类型的参数size_t
.
标准 C 没有提供这种类型的名称,也没有提供确定它是什么的好方法。如果size_t
是一个类型定义unsigned long
,例如,那么"%zd"
需要一个类型参数long
,但这不是一个可移植的假设。
该标准要求相应的有符号和无符号类型对两种类型中可表示的非负值使用相同的表示形式。脚注表示,这意味着它们可以作为函数参数互换。所以这:
size_t s = 42;
printf("s = %zd\n", s);
应该可以工作,并且应该打印“42”。它将解释该值42
,无符号类型size_t
,就好像它是相应的有符号类型。但确实没有充分的理由这样做,因为"%zu"
也是正确且定义良好的,无需诉诸额外的语言规则。和"%zu"
效劳于all类型的值size_t
,包括那些超出相应有符号类型范围的。
最后,POSIX定义了一个类型ssize_t
在标题中<unistd.h> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html and <sys/types.h> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html。尽管 POSIX 没有明确说明,但很可能是这样ssize_t
将是对应于的有符号类型size_t
。
因此,如果您正在编写 POSIX 特定的代码,"%zd"
(可能)是打印 type 值的正确格式ssize_t
.
更新:POSIX明确地说 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html that ssize_t
isn't必然是签名版本size_t
,因此编写假设它是的代码是不明智的:
ssize_t
这是一个有符号的模拟size_t
。措辞是这样的
实现可以选择使用更长的类型或
只是使用底层类型的签名版本size_t
。
所有返回的函数ssize_t
(read()
and write())
描述为
“实现定义的”输入结果超过 {SSIZE_MAX
}。
人们认识到,某些实现可能有int
是
小于size_t
。符合要求的应用程序将受到限制
以大于 { 的片段执行 I/OSSIZE_MAX
},但是符合
使用扩展的应用程序将能够使用整个范围,如果
该实施提供了扩展的范围,同时仍然具有
单一类型兼容的接口。符号size_t
and ssize_t
是
还需要在<unistd.h>
最大限度地减少调用所需的更改
到read()
and write()
。提醒实施者必须
可能同时包括两者<sys/types.h>
and <unistd.h>
在相同的
程序(无论顺序)没有错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)