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
等价的对象,并且没有不同的处理方式
编辑:
似乎有一些暗示,可能存在处理基本类型以外的类型的可能性
从
:
请参见*大小
akaint*\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__;