Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
13.3.4. Упрощение использования
gettext()Вызов
gettext()xgettextРассмотрим все-таки случай, когда статические строки не используются непосредственно:
static char *copyrights[] = { "Copyright 2004, Jane Programmer", "Permission is granted ...", /* ... Здесь куча легальностей */ NULL};void copyright(void) { int i; for (i = 0; copyrights[i] != NULL, i++) printf("%sn", gettext(copyrights[i]));}Здесь мы хотели бы иметь возможность вывести переводы строк об авторских правах, если они доступны. Однако, как извлекающее устройство
xgettextgettext()/
* ПЛОХОЙ КОД: не будет компилироваться */static char *copyrights[] = { gettext("Copyright 2004, Jane Programmer"), gettext("Permission is granted ..."), /* ... Здесь куча легальностей */ NULL};13.3.4.1. Переносимые программы: "
gettext.hЗдесь мы предполагаем, что вы хотите написать программу, которая может использоваться вместе с библиотекой GNU
gettextПометка строк включает два шага. Первый заключается в использовании вспомогательного заголовка
gettext.hgettextgettext()#define ENABLELNLS 1 /* ENABLE_NLS должен быть true, чтобы gettext() работала */#include "gettext.h" /* Вместо <libintl.h> */Если макрос
ENABLE_NLSgettext.hgettext()gettext()gettext/* Вызов псевдофункции, который служит в качестве маркера для автоматического извлечения сообщений, но не осуществляющий вызов gettext(). Перевод времени исполнения осуществляется в другом месте кода. Аргумент String должен быть символической строкой. Сцепленные строки и другие строковые выражения не будут работать. Разворачивание макроса не параметризовано, так что он подходит для инициализации статических переменных 'char[]' или 'const char[]'. */#define gettext_noop(String) StringКомментарий самодостаточен. С помощью этого макроса мы можем теперь перейти ко второму шагу. Мы перепишем код следующим образом:
#define ENABLE_NLS 1#include "gettext.h"static char copyrights[] = gettext_noop("Copyright 2004, Jane Programmern" "Permission is granted ...n" /* ... Здесь куча легальностей */ "So there.");void copyright(void) { printf("%sn", gettext(copyrights));}Обратите внимание, что мы сделали два изменения. Во-первых,
copyrightsgettext_noop()Второе изменение заключается в непосредственном выводе перевода в виде одной строки в
copyright()К этому времени вы, возможно, думаете: «Вот здорово, набирать каждый раз '
gettext(...)gettext.hgettext_()N_()#define ENABLE_NLS 1#include "gettext.h"#define _(msgid) gettext(msgid)#define N_(msgid) msgidТакой подход снижает накладные расходы по использованию
gettext()#include <stdio.h>#define ENABLE_NLS 1#include "gettext.h"
