Я пишу спецификатор преобразования (%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
и не имеют другой обработки.
EDIT:
Кажется, есть некоторый намек на то, что может существовать возможность обработки типов, отличных от основных.
С <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__;