我正在编写转换说明符(%b),以便能够以二进制形式打印任何无符号整数类型。
这是它的完整代码:https://codereview.stackexchange.com/questions/219994/register-b-conversion-specifier
现在一切似乎都正常,但有可能

sizeof(uintmax_t) > sizeof(unsigned long long)

对于size_t
glibc似乎只传递关于“normal”整数类型的信息(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);


参见*SIZEakaint *__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__;

最佳答案

现在就不可能做好准备吗?
对。
struct printf_info中的“不准备处理有许多真正整数大小的实现”。
相反,当今天使用j, z, t修饰符时,它以某种方式映射为none,l, ll
如果int128_t, int256_t, int512_t, int1024_t出来,肯定struct printf_info会进化。只是不知道今天是什么。

关于c - 将uintmax_t或size_t传递给自定义printf转换说明符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56068734/

10-11 19:38