printf: прикольная фича
Ещё один простой способ запутаться в том, что делает твой код, блин.
Прикольно, полезно когда локализацию делаешь строк, в некоторых языках порядок слов иной, не как в английском.Я бы не стал строку от переводчиков первым аргументом в printf совать.
Может пригодиться в случае, когда какой-то аргумент надо несколько раз подставить.
Я бы не стал строку от переводчиков первым аргументом в printf совать.А что делать с такими строками как "В слове %s ровно %u буква/буквы/букв"?
Почему не сувать? Штатный libintl компилятор даже проверять умеет чтобы строка не нарушала порядки.
Почему не сувать?Очень легко сделать ошибку, а ошибки в форматной строке ведут к серьезным последствиям. Отловить их очень сложно, нужно валидировать предварительно каждую форматную строку, плюс как-то проверять кол-во аргументов при вызове.
Штатный libintl компилятор даже проверять умеет чтобы строка не нарушала порядки.Проверки в рантайм добавляет? Или ты для каждого языка собираешься отдельный printf писать?
Проверки в рантайм добавляет? Или ты для каждого языка собираешься отдельный 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 критическая ошибка
При компиляции из .po в .mo, т.е. если у тебя не матчится строка и её перевод по параметрам, то ругается.Опачки.
Спасибо, что нашел. Надо будет проверить и своим сказать.
А ошибки с неправильным числом/типом аргументов ловятся? Типа:
printf(gettext("My name is %s" 10)
Не помешает ли вызов gettext компилятору увидеть тут ошибку?
банально собираешь без gettext, он дефайнится в значение аргумента и компилятор всё ловит.
А ошибки с неправильным числом/типом аргументов ловятся?И вполне неплохо ловятся!
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=]
Оставить комментарий
Werdna
В *printf можно переставлять аргументы местами:Не знал. Прикольно, полезно когда локализацию делаешь строк, в некоторых языках порядок слов иной, не как в английском.