将uintmax_t或size_t传递给自定义printf转换说明符

时间:2019-05-09 23:15:54

标签: c gcc printf

我正在编写一个转换说明符(%b),以便能够以二进制形式打印任何无符号整数类型。

这是完整的代码:https://codereview.stackexchange.com/questions/219994/register-b-conversion-specifier

现在一切似乎都可以正常工作,但是有可能

sizeof(uintmax_t) > sizeof(unsigned long long)

size_t

相同

并且glibc似乎只传递有关“普通”整数类型(unsigned +长度修饰符或char)的信息。现在是否为此做好准备?也许是因为尚无实现这两种类型的广告(AFAIK)的地方。

glibc如何处理jz长度修饰符?可能它们只是被注册为ll的等效项,并且没有其他处理。

编辑:

似乎有些暗示可能会处理除基本类型以外的其他类型。

来自<printf.h>

/* Type of a printf specifier-arginfo function.
 INFO gives information about the format specification.
 N, ARGTYPES, *SIZE has to contain the size of the parameter for
 user-defined types, and return value are as for parse_printf_format
 except that -1 should be returned if the handler cannot handle
 this case. This allows to partially overwrite the functionality
 of existing format specifiers. */

 typedef int printf_arginfo_size_function (const struct printf_info *__info,
                     size_t __n, int *__argtypes,
                     int *__size);

请参阅*SIZEint *__size

还有不建议使用的旧函数中的另一个提示:

/* Old version of 'printf_arginfo_function' without a SIZE parameter. */

 typedef int printf_arginfo_function (const struct printf_info *__info,
                 size_t __n, int *__argtypes);

/* Obsolete interface similar to register_printf_specifier. It can only
 handle basic data types because the ARGINFO callback does not return
 information on the size of the user-defined type. */

 extern int register_printf_function (int __spec, printf_function __func,
                 printf_arginfo_function __arginfo)
 __THROW __attribute_deprecated__;

1 个答案:

答案 0 :(得分:2)

  

现在是否为此做好准备?

是的

struct printf_info未准备好处理具有很多真实整数大小的实现。

当今天使用j, z, t修饰符时,它以某种方式映射为 none l, ll

如果int128_t, int256_t, int512_t, int1024_t出现,肯定会struct printf_info发展。只是不知道今天是什么。