Какова цель спецификатора формата "% qd" в `printf ()`? - PullRequest
0 голосов
/ 13 июня 2018

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

#include <stdio.h>

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

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

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

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

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

Однако egcsgcc до этого) обрабатывает его как эквивалент ll, что не всегда эквивалентно: openbsd-alpha настроен так, что long64 бита, и, следовательно, 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

0 голосов
/ 13 июня 2018

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

0 голосов
/ 13 июня 2018

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

С Википедия :

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

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

...