printf: прикольная фича

Werdna

В *printf можно переставлять аргументы местами:

printf("%2$s %1$d", 1, "AAA");

Не знал. Прикольно, полезно когда локализацию делаешь строк, в некоторых языках порядок слов иной, не как в английском.

schipuchka1

Ещё один простой способ запутаться в том, что делает твой код, блин.

istran

Прикольно, полезно когда локализацию делаешь строк, в некоторых языках порядок слов иной, не как в английском.
Я бы не стал строку от переводчиков первым аргументом в printf совать.
Может пригодиться в случае, когда какой-то аргумент надо несколько раз подставить.

Werdna

Я бы не стал строку от переводчиков первым аргументом в printf совать.
А что делать с такими строками как "В слове %s ровно %u буква/буквы/букв"?
Почему не сувать? Штатный libintl компилятор даже проверять умеет чтобы строка не нарушала порядки.

istran

Почему не сувать?
Очень легко сделать ошибку, а ошибки в форматной строке ведут к серьезным последствиям. Отловить их очень сложно, нужно валидировать предварительно каждую форматную строку, плюс как-то проверять кол-во аргументов при вызове.
Штатный libintl компилятор даже проверять умеет чтобы строка не нарушала порядки.
Проверки в рантайм добавляет? Или ты для каждого языка собираешься отдельный printf писать?

Werdna

Проверки в рантайм добавляет? Или ты для каждого языка собираешься отдельный printf писать?
При компиляции из .po в .mo, т.е. если у тебя не матчится строка и её перевод по параметрам, то ругается.
 
#, c-format
msgid "Hello, %s %d times!\n"
msgstr "Здравствуйте %d раз, %s!\n"

 

$ msgfmt -co ru/LC_MESSAGES/messages.mo ru/LC_MESSAGES/messages.po
ru/LC_MESSAGES/messages.po:17: number of format specifications in 'msgid' and 'msgstr' does not match
msgfmt: найдена 1 критическая ошибка

uncle17

При компиляции из .po в .mo, т.е. если у тебя не матчится строка и её перевод по параметрам, то ругается.
Опачки.
Спасибо, что нашел. Надо будет проверить и своим сказать.

istran

Понятно, я просто не знал, что такое gettext.
А ошибки с неправильным числом/типом аргументов ловятся? Типа:

printf(gettext("My name is %s" 10)

Не помешает ли вызов gettext компилятору увидеть тут ошибку?

vall

банально собираешь без gettext, он дефайнится в значение аргумента и компилятор всё ловит.

Werdna

А ошибки с неправильным числом/типом аргументов ловятся?
И вполне неплохо ловятся!
 
proga.c: In function ‘main’:
proga.c:17:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
printf(_("Hello, %s!\n" 10);
^

 
proga.c:20:2: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char *’ [-Wformat=]
printf(ngettext("word %s contains %u letter", "there are %u letter in the word %s", 3 "qwe", 3);
^
proga.c:20:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
Оставить комментарий
Имя или ник:
Комментарий: