C 将uintmax\u t或size\u t传递给自定义printf转换说明符

C 将uintmax\u t或size\u t传递给自定义printf转换说明符,c,gcc,printf,C,Gcc,Printf,我正在编写一个转换说明符(%b),以便能够以二进制打印任何无符号整数类型 以下是它的完整代码: 现在一切似乎都正常,但有可能 sizeof(uintmax_t) > sizeof(unsigned long long) 与size\u t glibc似乎只传递关于“普通”整数类型的信息(无符号的+长度修饰符或字符)。难道现在就不可能做好准备吗?可能是因为在这两种类型更广泛的地方还没有实现(AFAIK) glibc如何处理j和z长度修饰符?可能它们只是注册为与ll等价的对象,并且没有不同的

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

以下是它的完整代码:

现在一切似乎都正常,但有可能

sizeof(uintmax_t) > sizeof(unsigned long long)
size\u t

glibc似乎只传递关于“普通”整数类型的信息(
无符号的
+长度修饰符或
字符
)。难道现在就不可能做好准备吗?可能是因为在这两种类型更广泛的地方还没有实现(AFAIK)

glibc如何处理
j
z
长度修饰符?可能它们只是注册为与
ll
等价的对象,并且没有不同的处理方式

编辑:

似乎有一些暗示,可能存在处理基本类型以外的类型的可能性

请参见
*大小
aka
int*\uu大小

在不推荐使用的旧函数中还有另一个提示:

/* 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
in未准备好处理存在许多真正整数大小的实现

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


如果
int128\u t、int256\u t、int512\u t、int1024\u t
出现,肯定会演变。现在还不知道它是什么。

glibc库不必处理不存在的(假设的)情况-它只需要处理当前在实际硬件上遇到的情况。它不会试图处理这种情况,因为它没有遇到这种情况。
printf()
不太可能处理
\uuuu int128\u t
类型,即使编译器可能(部分)支持它们。Glibc是开源的。如果你不想知道它是如何工作的,那么,你是否想知道在你的代码中使用什么类型的va_arg?如果使用“z”,它可能使用va_arg(va,size_t),如果使用“j”,它可能使用va_arg(va,uintmax_t)。我没有看到问题。@immibis问题在于当使用
j
z
调用时,
printf
传递给我的函数的信息。;由于这种冲突,
intmax\u t
完全有可能被弃用或从C2x中删除,或者至少重新确定范围以避免误导开发人员,使他们认为它在这方面是有用的。
/* 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__;