What is the purpose of format specifier “%qd” in `printf()`?

后端 未结 3 1339
心在旅途
心在旅途 2021-02-18 17:24

I saw format specifier %qd when browsing github code. Then I checked in GCC compiler, it\'s working fine.

#include 

int main()
{  
          


        
3条回答
  •  清酒与你
    2021-02-18 17:55

    %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

提交回复
热议问题