是否有宏为IV
、UV
、STRLEN
、Size_t
和SSize_t
提供正确的printf
格式说明符?没有一个列在perlapi中。
C 为stdint.h
提供的类型的格式说明符提供了宏,例如uint32_t
。
#include <inttypes.h>
#include <stdint.h>
uint32_t i = ...;
printf("i = %" PRIu32 "n", i);
对于IV
、UV
、STRLEN
、Size_t
和SSize_t
,是否有类似于PRIu32
的东西?
更大的问题是,我试图建议修复在 Linux 的 Windows 子系统上的 Ubuntu 上安装 Sort::Key 时产生的以下编译警告:
Key.xs: In function ‘_keysort’:
Key.xs:237:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘IV {aka long int}’ [-Wformat=]
croak("unsupported sort type %d", type);
^~~~~~~~~~~~~~~~~~~~~~~~~~
Key.xs: In function ‘_multikeysort’:
Key.xs:547:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘STRLEN {aka long unsigned int}’ [-Wformat=]
croak("wrong number of results returned "
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Key.xs:547:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘IV {aka long int}’ [-Wformat=]
-
对于
UV
,存在以下宏:UVuf
(十进制(UVof
(八进制(UVxf
(LC 十六进制(UVXf
(UC 十六进制(
-
对于
IV
,存在以下宏:IVdf
(十进制(
-
对于
NV
,存在以下宏:NVef
("%e
-ish"(NVff
("%f
-ish"(NVgf
("%g
-ish"(
-
对于
Size_t
和STRLEN
,请使用内置的z
长度修饰符。[1]%zu
(十进制(%zo
(八进制(%zx
(四角十六进制(%zX
(UC 十六进制(
-
对于
SSize_t
,请使用内置的z
长度修饰符。[1]%zd
(十进制(
例如
IV iv = ...;
STRLEN len = ...;
croak("iv=%" IVdf " len=%zu", iv, len);
- 虽然
Size_t
和SSize_t
是可配置的,但它们在实践中与size_t
和ssize_t
没有什么不同,STRLEN
是Size_t
的typedef。
如果Size_t
与size_t
相同,则%zu
是正确的。
STRLEN
可能(但不确定(与size_t
相同。
如果SSize_t
与ssize_t
相同,那么%zd
可能是正确的(这很复杂(。
对于其他类型,如果不知道它们对应于哪种预定义类型,请转换为已知类型。了解签名会有所帮助。例如:
some_unknown_signed_integer_type n = 42;
some_unknown_unsigned_integer_type x = 128;
printf("n = %jdn", (intmax_t)n);
printf("x = %jun", (uintmax_t)x);
intmax_t
和uintmax_t
在<stdint.h>
中定义。
您可以侥幸转换为long
或unsigned long
并使用%ld
或%lu
,例如,如果您碰巧知道该类型不超过long
或unsigned long
.