Разные макросы

Miscellaneous Macros — Специфичные макросы которые используются не часто.

Краткое описание

#include <glib.h> #define G_INLINE_FUNC #define G_STMT_START #define G_STMT_END #define G_BEGIN_DECLS #define G_END_DECLS #define G_N_ELEMENTS (arr) #define G_VA_COPY (ap1,ap2) #define G_STRINGIFY (macro_or_string) #define G_GNUC_EXTENSION #define G_GNUC_CONST #define G_GNUC_PURE #define G_GNUC_MALLOC #define G_GNUC_DEPRECATED #define G_GNUC_NORETURN #define G_GNUC_UNUSED #define G_GNUC_PRINTF ( format_idx, arg_idx ) #define G_GNUC_SCANF ( format_idx, arg_idx ) #define G_GNUC_FORMAT ( arg_idx ) #define G_GNUC_NULL_TERMINATED #define G_GNUC_WARN_UNUSED_RESULT #define G_GNUC_FUNCTION #define G_GNUC_PRETTY_FUNCTION #define G_GNUC_NO_INSTRUMENT #define G_HAVE_GNUC_VISIBILITY #define G_GNUC_INTERNAL #define G_LIKELY (expr) #define G_UNLIKELY (expr) #define G_STRLOC #define G_STRFUNC #define G_GINT16_MODIFIER #define G_GINT16_FORMAT #define G_GUINT16_FORMAT #define G_GINT32_MODIFIER #define G_GINT32_FORMAT #define G_GUINT32_FORMAT #define G_GINT64_MODIFIER #define G_GINT64_FORMAT #define G_GUINT64_FORMAT #define G_GSIZE_MODIFIER #define G_GSIZE_FORMAT #define G_GSSIZE_FORMAT

Описание

Эти макросы обеспечивают много специфичных улучшений которые не часто нужны разработчикам программ.

Детали

G_INLINE_FUNC

#define G_INLINE_FUNC

Этот макрос используется для экспорта прототипов функций, таким образом они могут быть связаны с внешними версиями когда включение в заголовок (inlining) не выполнено. Файл который реализует функции должен определить G_IMPLEMENTS_INLINES перед включением заголовков которые содержат G_INLINE_FUNC деклорации. Так как inlining очень зависит от компилятора, правильно использовать этот макрос очень сложно.

Этот макрос часто принимается для замены ключевого слова; ключевое слово уже объявлено переносимым способом в glib заголовках и может использоваться обычно.


G_STMT_START

#define G_STMT_START

Используется внутри многооператорного макроса так чтобы он мог быть использован в местах, где компилятором ожидается только один оператор.


G_STMT_END

#define G_STMT_END

Используется внутри многооператорного макроса так чтобы он мог быть использован в местах, где компилятором ожидается только один оператор.


G_BEGIN_DECLS

#define G_BEGIN_DECLS

Используется (наряду с G_END_DECLS) для ограничения (bracket) заголовочных файлов. Если используемый компилятор это C++ компилятор, добавляется extern "C" рядом с заголовком.


G_END_DECLS

#define G_END_DECLS

Используется (наряду с G_BEGIN_DECLS) для ограничения заголовочных файлов. Если используемый компилятор это C++ компилятор, добавляется extern "C" рядом с заголовком.


G_N_ELEMENTS()

#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))

Определяет количество элементов в массиве. Массив должен быть объявлен чтобы компилятор знал его размер во время компиляции; этот макрос не будет работать на массиве распределённом в динамической памяти, только статические массивы или массивы в стеке.

arr : массив

G_VA_COPY()

#define G_VA_COPY(ap1,ap2)

Переносимый способ копирования va_list переменных.

Чтобы использовать эту функцию, вы должны включить string.h самостоятельно, потому что эта команда может использовать memmove(), а GLib не включит string.h за вас.

ap1 : переменная va_list помещаемая в виде копии ap2.
ap2 : va_list.

G_STRINGIFY()

#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string)

Принимает макрос или строку и преобразует в строку.

macro_or_string : макрос или строка.

G_GNUC_EXTENSION

#define G_GNUC_EXTENSION

Расширение для __extension__ когда в качестве компилятора используется gcc. Это просто сообщает gcc не предупреждать о следующем не стандартном коде когда выполняется компиляция с опцией -pedantic.


G_GNUC_CONST

#define G_GNUC_CONST

Расширение для GNU C const параметра функции если компилятор gcc. Объявляет функцию как константу включающую лучшую оптимизацию вызываемой функции. Константная функция не проверяет никаких значений кроме параметров, и влияет только на возвращаемое значение. Детали смотрите в документации GNU C.

Примечание

Функция которая имеет указанные аргументы и проверяет указанные данные не должна объявляться константой. Аналогично, функция которая вызвана не константной функцией обычно не должна быть константной. Это не имеет смысла для функций констант возвращающих (void) пустое значение.


G_GNUC_PURE

#define G_GNUC_PURE

Расширение для GNU C pure параметра функции если компилятор gcc. Объявление функции как полное включение (pure enables) улучшает оптимизацию вызова функции. Полные (pure) функции имеют влияние только на возвращаемое значение а возвращаемое значение зависит только от параметров и/или глобальных переменных. Детали смотрите в документации GNU C.


G_GNUC_MALLOC

#define G_GNUC_MALLOC

Расширение для GNU C malloc параметра функции если компилятор gcc. Объявление функции с включением malloc улучшает оптимизацию функции. Функция может иметь параметр malloc, если возвращаемый указатель гарантировано не связан с любым другим указателем когда возвращается функцией (на практике, это означает вновь распределяемую память). Подробности смотрите в документации GNU C.

Начиная с версии 2.6


G_GNUC_DEPRECATED

#define G_GNUC_DEPRECATED

Расширение для GNU C deprecated параметра для компилятора gcc. Он может использоваться для маркировки определения типа (typedefs), переменных и функций как устаревших. Когда вызывается с опцией -Wdeprecated, компилятор будет предупреждать когда используется устаревший интерфейс. Подробности смотрите в документации GNU C.

Начиная с версии 2.2


G_GNUC_NORETURN

#define G_GNUC_NORETURN

Расширение для GNU C noreturn параметра функции, если компилятор gcc. Он используется для объявления функции когда нет возвращаемого значения. Включает оптимизацию функции и предотвращает возможные предупреждения компилятора. Детали смотрите в документации GNU C.


G_GNUC_UNUSED

#define G_GNUC_UNUSED

Расширение GNU C unused параметра функции, если компилятор gcc. Используется для объявления функций которые никогда не используются. Предотвращает возможные предупреждения компилятора. Подробности смотрите в документации GNU C.


G_GNUC_PRINTF()

#define G_GNUC_PRINTF( format_idx, arg_idx )

Расширение для GNU C format параметра функции, если компилятор gcc. Используется для объявления функций которые принимают разное количество аргументов с таким же синтаксисом как у printf(). Позволяет компилятору контролировать типы помещаемых аргументов в функцию. Подробности смотрите в GNU C.

gint g_snprintf (gchar *string, gulong n, gchar const *format, ...) G_GNUC_PRINTF (3, 4);
format_idx : перечень аргументов соответствующий форматируемой строке. (Нумерация аргументов начинается с 1).
arg_idx : первый из форматируемых параметров.

G_GNUC_SCANF()

#define G_GNUC_SCANF( format_idx, arg_idx )

Расширение GNU C format параметра функции, если компилятор gcc. Используется для объявления функций которые принимают переменное количество аргументов, с таким же синтаксисом как у scanf(). Позволяет компилятору проверять тип помещаемых в функцию аргументов. Подробности смотрите в документации GNU C.

format_idx : перечень аргументов соответствующий форматируемой строке. (Нумерация аргументов начинается с 1).
arg_idx : первый из форматируемых параметров.

G_GNUC_FORMAT()

#define G_GNUC_FORMAT( arg_idx )

Расширение GNU C format_arg параметра функции, если компилятор gcc. Этот атрибут функции определяет что функция принимает форматированную строку в стиле функций printf(), scanf(), strftime() или strfmon() и модифицирует так, чтобы результат можно было поместить в printf(), scanf(), strftime() или strfmon() функцию (с оставшимися параметрами в формате функции так же, как если они были бы не модифицированной строкой). Подробности смотрите в документации GNU C.

gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2);
arg_idx : порядковый номер аргумента.

G_GNUC_NULL_TERMINATED

#define G_GNUC_NULL_TERMINATED

Расширение GNU C sentinel параметра функции, если компилятор gcc, или "" если нет. Этот параметр функции применяется только к variadic функциям и инструктирует компилятор проверить что список аргументов завершается явным NULL. Подробности смотрите в документации GNU C.

Начиная с версии 2.8


G_GNUC_WARN_UNUSED_RESULT

#define G_GNUC_WARN_UNUSED_RESULT

Расширение GNU C warn_unused_ersult параметра функции, если компилятор gcc, или "" если нет. Этот параметр функции заставляет компилятор сообщать предупреждение, если результат вызова функции игнорируется. Подробности смотрите в документации GNU C.

Начиная с версии 2.10


G_GNUC_FUNCTION

#define G_GNUC_FUNCTION

Расширение GNU C __FUNCTION__ переменной, если компилятор gcc, или "" если нет. GNU C __FUNCTION__ переменная содержит имя текущей функции. Подробности смотрите в документации GNU C.


G_GNUC_PRETTY_FUNCTION

#define G_GNUC_PRETTY_FUNCTION

Расширение для GNU C __PRETTY_FUNCTION__ переменной, если компилятор gcc, или "" если нет. GNU C __PRETTY_FUNCTION__ переменная содержит имя текущей функции. Для C программ это тоже самое как переменная __FUNCTION__, но для C++ включается дополнительная информация, такая как прототип и класс функции. Подробности смотрите в документации GNU C.


G_GNUC_NO_INSTRUMENT

#define G_GNUC_NO_INSTRUMENT

Расширение GNU C no_instrument_function параметра функции, если компилятор gcc. Функция с этим параметром не будет инструментом для профилирования, когда компилятор вызывается с опцией -finstrument-functions. Подробности смотрите в документации GNU C.


G_HAVE_GNUC_VISIBILITY

#define G_HAVE_GNUC_VISIBILITY 1

Этот макрос определяется как 1, если компилятор поддерживает ELF видимость атрибутов (на данный момент только gcc).

Начиная с версии 2.6


G_GNUC_INTERNAL

#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))

Расширение GNU C visibility(hidden) параметра, если компилятор поддерживает это (в настоящее время только gcc). Этот параметр может использоваться для маркировки библиотечных функций как используемые только внутри библиотеки, чтобы не создавать не эффективный ввод PLT. Помните что статичные функции не нуждаются в подобной маркировки. Подробности смотрите в документации GNU C.

Начиная с версии 2.6


G_LIKELY()

#define G_LIKELY(expr)

Подсказывает компилятору что логическое выражение вероятно эквивалентно значению true. Компилятор может использовать эту информацию для оптимизации.

if (G_LIKELY (random() != 1)) g_print ("not one");
expr : логическое выражение

Начиная с версии 2.2


G_UNLIKELY()

#define G_UNLIKELY(expr)

Подсказывает компилятору что логическое выражение вероятно не равно значению true. Компилятор может использовать эту информацию для оптимизации.

if (G_UNLIKELY (random() == 1)) g_print ("a random one");
expr : логическое выражение

Начиная с версии 2.2


G_STRLOC

#define G_STRLOC

Дополняется до строки идентифицирующей текущую позицию кода.


G_STRFUNC

#define G_STRFUNC

Дополняется до строки идентифицирующей текущую функцию.

Начиная с версии 2.4


G_GINT16_MODIFIER

#define G_GINT16_MODIFIER "h"

Платформо-зависимая длина модификатора для создания преобразуемых модификаторов printf() для значений типов gint16 или guint16. Это строковые литералы, но не включающие знак процента, так что вы можете добавить точность и длину модификатора между знаком процента и преобразующим спецификатором и прибавить с переди преобразованный спецификатор.

Следующий пример печатает "0x7b";

gint16 value = 123; g_print ("%#" G_GINT16_MODIFIER "x", value);

Начиная с версии 2.4


G_GINT16_FORMAT

#define G_GINT16_FORMAT "hi"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа gint16. Это строковый литерал, но не включает знак процента, таким образом вы можете добавлять точность и длину модификатора между знаком процента и спецификатором преобразования.

gint16 in; gint32 out; sscanf ("42", "%" G_GINT16_FORMAT, &in) out = in * 1000; g_print ("%" G_GINT32_FORMAT, out);


G_GUINT16_FORMAT

#define G_GUINT16_FORMAT "hu"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа guint16. Смотрите также G_GINT16_FORMAT.


G_GINT32_MODIFIER

#define G_GINT32_MODIFIER ""

Платформо-зависимая длина модификатора для создания преобразуемых спецификаторов printf() для значений типов gint32 или guint32. Смотрите также G_GINT16_MODIFIER.

Начиная с версии 2.4


G_GINT32_FORMAT

#define G_GINT32_FORMAT "i"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа gint32. Смотрите также G_GINT16_FORMAT.


G_GUINT32_FORMAT

#define G_GUINT32_FORMAT "u"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа guint32. Смотрите также G_GINT16_FORMAT.


G_GINT64_MODIFIER

#define G_GINT64_MODIFIER "ll"

Зависящая от платформы длина модификатора для создания спецификаторов преобразования printf() для значений типов gint64 или guint64. Смотрите также G_GINT16_MODIFIER.

Примечание

Некоторые платформы не поддерживают печать 64 битных целочисленных, даже если поддерживают типы. На таких платформах G_GINT64_MODIFIER не определяется.

Начиная с версии 2.4


G_GINT64_FORMAT

#define G_GINT64_FORMAT "lli"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа gint64. Смотрите также G_GINT16_FORMAT.

Примечание

Некоторые платформы не поддерживают сканирование и печать 64 битных целочисленных, даже если поддерживают типы. На таких платформах G_GINT64_FORMAT не определяется. Помните что scanf() может не поддерживать 64 битные целочисленные, даже если G_GINT64_FORMAT определён. Из-за плохой обработки ошибок, scanf() не рекомендуется для использования в анализе так или иначе; вместо неё возможно использование g_strtoull().


G_GUINT64_FORMAT

#define G_GUINT64_FORMAT "llu"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа guint64. Смотрите также G_GINT16_FORMAT.

Примечание

Некоторые платформы не поддерживают сканирование и печать 64 битных целочисленных, даже если поддерживают типы. На таких платформах G_GUINT64_FORMAT не определяется. Помните что scanf() может не поддерживать 64 битные целочисленные, даже если G_GUINT64_FORMAT определён. Из-за плохой обработки ошибок, scanf() не рекомендуется для использования в анализе так или иначе; вместо неё возможно использование g_strtoull().


G_GSIZE_MODIFIER

#define G_GSIZE_MODIFIER ""

Платформо-зависимая длина модификатора для создания спецификаторов printf() для значений типов gsize или gssize. Смотрите также G_GINT16_MODIFIER.

Начиная с версии 2.6


G_GSIZE_FORMAT

#define G_GSIZE_FORMAT "u"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа gsize. Смотрите также G_GINT16_FORMAT.

Начиная с версии 2.6


G_GSSIZE_FORMAT

#define G_GSSIZE_FORMAT "i"

Это платформо-зависимый спецификатор преобразования для сканирования и печати значений типа gssize. Смотрите также G_GINT16_FORMAT.

Начиная с версии 2.6