Ответ 1
Хотя в обычном поиске Google есть только несколько статей о %qd
, для дальнейшего использования этот ответ представляет собой подборку моих собственных исследований, rsp и небольшие обсуждения здесь, в разделе комментариев Джонатан Леффлер и Рассказчик.
%qd
предназначался для комфортной обработки 64 битов на всех машины, и изначально был bsd-ism (quad_t
).Тем не менее,
egcs
(иgcc
до этого) рассматривает его как эквивалентll
, что не всегда эквивалентен: openbsd-alpha настроен так, чтоlong
64 бита, и, следовательно,quad_t
определен какlong
. В этом конкретном случае атрибут printf-like не работает как предназначен.If
sizeof(long long) == sizeof(long)
on openbsd-alpha, it should work anyway - т.е.%ld
,%lld
, и%qd
should be interchangeable. On OpenBSD/alpha,sizeof(long) == sizeof(long long) == 8
.
Несколько платформенных вариантов длины стали существовать до широкого использования расширений ISO C99, q
был одним из них. Он использовался для целочисленных типов, что заставляет printf
ожидать 64-битный (четырехзначное) целочисленный аргумент. Обычно встречается на платформах BSD.
Тем не менее, оба из C99 и C11 ничего не говорят о модификаторе длины q
. Страница справочника macOS (BSD) для fprintf()
помечает q
как устаревшую. Таким образом, вместо q
рекомендуется использовать ll
.
Рекомендации:
https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html