%qd
was intended to handle 64 bits comfortably on all
machines, and was originally a bsd-ism (quad_t
).
However, egcs
(and gcc
before that) treats it as equivalent to ll
, which
is not always equivalent: openbsd-alpha is configured so that long
is
64 bits, and hence quad_t
is typedef'ed to long
.
In that particular case, the printf-like attribute doesn't work as
intended.
If sizeof(long long) == sizeof(long)
on openbsd-alpha, it should work
anyway - i.e. %ld
, %lld
, and %qd
should be interchangeable. On OpenBSD/alpha, sizeof(long) == sizeof(long long) == 8
.
Several platform-specific length options came to exist prior to widespread use of the ISO C99 extensions, q
was one of them. It was used for integer types, which causes printf
to expect a 64-bit (quad word) integer argument. It is commonly found in BSD platforms.
However, both of the C99 and C11 says nothing about length modifier q
. The macOS (BSD) manual page for fprintf()
marks q
as deprecated. So, using ll
is recommended in stead of q
.
References:
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