Какова цель спецификатора формата "% qd" в "printf()"?

Я видел спецификатор формата %qd при просмотре кода github. Затем я проверил компилятор GCC, он работает нормально.

#include <stdio.h>

int main()
{  
    long long num = 1;
    printf("%qd\n", num);
    return 0;
}

Какова цель спецификатора формата %qd в printf()?

Ответ 1

Хотя в обычном поиске Google есть только несколько статей о %qd, для дальнейшего использования этот ответ представляет собой подборку моих собственных исследований, rsp и небольшие обсуждения здесь, в разделе комментариев Джонатан Леффлер и Рассказчик.

%qd предназначался для комфортной обработки 64 битов на всех машины, и изначально был bsd-ism (quad_t).

Тем не менее, egcsgcc до этого) рассматривает его как эквивалент 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

https://en.wikipedia.org/wiki/Printf_format_string

https://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p7

Ответ 2

q означает спецификатор формата квадратного слова в функции printf, который используется для удобной обработки 64 бит на всех машинах.

Из Википедии:

Кроме того, до широкого использования расширений ISO C99 появилось несколько вариантов длины платформы:

...

q - для целочисленных типов, вызывает printf для ожидания целочисленного аргумента из 64-разрядного (четырехзначного слова). Обычно встречаются на платформах BSD

Ответ 3

Ответ на один из наиболее интересных вопросов, связанных с языком C. Символический литерал "%qd" представляет собой четырехзначное слово, которое задается как используемое для обработки 64 бит эффективно с функцией printf на языке программирования C. Также просто помните, что начиная с 1999 года в стандарте C указано, что sizeof(long long) >= sizeof(long), и можно сделать вывод, что диапазон long long имеет размер не менее 64 бит.