| |
glib определяет некоторое количество знакомых по программированию на C макросов; они показаны в списке макросов 2..1. Все они должны быть самодокументирующимися. TRUE/FALSE/NULL -- это обычные 1/0/((void *) 0); MIN()/MAX() возвращают наименьший или наибольший из своих аргументов. ABS() возвращает абсолютное значение своего аргумента. CLAMP(x, low, high) возвращает x, если x лежит в интервале [low, high]; если x меньше low, то возвращается low; если больше high, то high.
TRUE FALSE NULL MAX(a, b) MIN(a, b) ABS(x) CLAMP(x, low, high)
В glib существует также много уникальных макросов, такие как переносимые преобразования gpointer-в-gint и gpointer-в-guint, которые приведены в списке макросов 2..2.
Большинство структур данных glib спроектированы так, чтобы хранить gpointer. Если вы хотите хранить указатели на динамически распределяемые объекты, это правильный выбор. Однако, иногда вы захотите хранить простой список целых чисел, без динамического его распределения. Хотя стандарт C это строго и не гарантирует, возможно хранить gint или guint в переменной gpointer на большом количестве платформ, куда спортирована glib; в некоторых случаях требуется промежуточное приведение типов. Макросы в списке макросов 2..2 делают ненужным приведение типов.
Вот пример:
gint my_int; gpointer my_pointer; my_int = 5; my_pointer = GINT_TO_POINTER(my_int); printf("We are storing %d\n", GPOINTER_TO_INT(my_pointer));
Однако, будьте осторожны: эти макросы позволяют вам хранить целое число в указателе, но хранение указателя в целом числе не будет работать. Чтобы сделать это переносимо, вы должны хранить указатель в типе long. (Однако, это несомненно является плохой идеей.)
GINT_TO_POINTER(p) GPOINTER_TO_INT(p) GUINT_TO_POINTER(p) GPOINTER_TO_UINT(p)
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |