Передайте uintmax_t или size_t в пользовательский спецификатор преобразования printf - PullRequest
1 голос
/ 10 мая 2019

Я пишу спецификатор преобразования (%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__;

1 Ответ

2 голосов
/ 10 мая 2019

Разве сейчас невозможно подготовиться к этому?

Да.

struct printf_info не подготовлен для обработки реализации, в которой много истинных целых чиселразмеры.

Вместо этого, когда сегодня используется модификатор j, z, t, он отображается как none , l, ll.

Если int128_t, int256_t, int512_t, int1024_t выйдет,конечно struct printf_info будет развиваться.Просто неизвестно, что это сегодня.

...