我正在编写一个转换说明符(%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如何处理j
和z
长度修饰符?可能它们只是被注册为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);
请参阅*SIZE
或int *__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__;
答案 0 :(得分:2)
现在是否为此做好准备?
是的
struct printf_info
未准备好处理具有很多真实整数大小的实现。
当今天使用j, z, t
修饰符时,它以某种方式映射为 none ,l, ll
。
如果int128_t, int256_t, int512_t, int1024_t
出现,肯定会struct printf_info
发展。只是不知道今天是什么。