Хотя в обычном поиске Google есть только несколько статей о %qd
, для дальнейшего использования этот ответ является компиляцией моего собственного исследования, ответом rsp и небольшим обсуждением здесь, в комментариях.секция Джонатана Леффлера и StoryTeller .
%qd
предназначалась для комфортной обработки 64 битов на всех машинах и изначально была bsd-ism (quad_t
).
Однако egcs
(и gcc
до этого) обрабатывает его как эквивалент ll
, что не всегда эквивалентно: openbsd-alpha настроен так, что long
64 бита, и, следовательно, quad_t
определяется по типу long
.В этом конкретном случае атрибут printf-like не работает должным образом.
Если sizeof(long long) == sizeof(long)
на openbsd-alpha, он должен работать в любом случае - то есть %ld
, %lld
и %qd
должны быть взаимозаменяемыми.В OpenBSD / alpha sizeof(long) == sizeof(long long) == 8
.
До широкого использования расширений ISO C99 существовало несколько опций длины для конкретной платформы, одним из которых был q
.Он использовался для целочисленных типов, что заставляет printf
ожидать 64-разрядный (четырехзначное) целочисленный аргумент.Это обычно встречается на платформах BSD.
Однако оба C99 и C11 ничего не говорят о модификаторе длины q
.Страница справочника macOS (BSD) для fprintf()
помечает q
как устаревшую.Таким образом, рекомендуется использовать ll
вместо q
.
Список литературы:
https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html
https://en.wikipedia.org/wiki/Printf_format_string
https://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p7