Какой компилятор не поддерживает стиль "% # x" в флагах printf? - PullRequest
3 голосов
/ 03 января 2012

Я понимаю, что% # x дает тот же эффект, что и 0x% x, и соответствует стандарту POSIX. Но люди упоминают, что некоторые компиляторы не поддерживают это. Это правда, какой-нибудь пример?

Ответы [ 4 ]

5 голосов
/ 03 января 2012

Помимо, возможно, некоторых неработающих библиотек C встраиваемых систем, модификатор # должен поддерживаться повсеместно. Однако %#x и 0x%x - это не одно и то же. Они дают разные результаты для значения 0, и модификатор # всегда будет печатать x в том же случае, что и шестнадцатеричные цифры (например, %#x дает 0xa и %#X дает 0XA) при использовании 0x%X позволит вам иметь строчные x и заглавные шестнадцатеричные цифры (гораздо приятнее визуально, по крайней мере для меня). Поэтому я считаю, что на практике редко используется модификатор #.

2 голосов
/ 03 января 2012

Флаг # не из POSIX, а из стандарта C (§7.21.6.1).Если компилятор или библиотека не поддерживает его, то это не компилятор C / стандартная библиотека.

2 голосов
/ 03 января 2012

%#x - допустимая спецификация преобразования в строке формата printf в C89, C99 и C11.

1 голос
/ 03 января 2012

Это совершенно верно согласно C Спецификация - 7.21.6.1 The fprintf function - точка #6

#

Результат преобразуется в «альтернативную форму»,Для преобразования o это увеличивает точность, если и только если необходимо, чтобы первая цифра результата была равна нулю (если значение и точность равны 0, печатается один 0).Для преобразования x (или X) ненулевой результат имеет префикс 0x (или 0X).Для преобразований a, A, e, E, f, F, g и G результат преобразования числа с плавающей запятой всегда содержит символ десятичной запятой, даже если после него нет цифр.(Обычно знак десятичной точки появляется в результате этих преобразований, только если за ним следует цифра.) Для преобразований g и G конечные нули не удаляются из результата.Для других преобразований поведение не определено.

...