Perl API 类型的 printf 格式说明符



是否有宏为IVUVSTRLENSize_tSSize_t提供正确的printf格式说明符?没有一个列在perlapi中。


C 为stdint.h提供的类型的格式说明符提供了宏,例如uint32_t

#include <inttypes.h>
#include <stdint.h>
uint32_t i = ...;
printf("i = %" PRIu32 "n", i);

对于IVUVSTRLENSize_tSSize_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_tSTRLEN,请使用内置的z长度修饰符。[1]

    • %zu(十进制(
    • %zo(八进制(
    • %zx(四角十六进制(
    • %zX(UC 十六进制(
  • 对于SSize_t,请使用内置的z长度修饰符。[1]

    • %zd(十进制(

例如

IV iv      = ...;
STRLEN len = ...;
croak("iv=%" IVdf " len=%zu", iv, len);

  1. 虽然Size_tSSize_t是可配置的,但它们在实践中与size_tssize_t没有什么不同,STRLENSize_t的typedef。

如果Size_tsize_t相同,则%zu是正确的。

STRLEN可能(但不确定(与size_t相同。

如果SSize_tssize_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_tuintmax_t<stdint.h>中定义。

您可以侥幸转换为longunsigned long并使用%ld%lu,例如,如果您碰巧知道该类型不超过longunsigned long.

最新更新