我正在编写转换说明符(%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如何处理
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
akaint *__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/