Справочное описание GLib | ||||
---|---|---|---|---|
Макросы преобразования типовType Conversion Macros — Переносимый способ хранения целочисленных в указателях переменных. |
#include <glib.h>
#define GINT_TO_POINTER (i)
#define GPOINTER_TO_INT (p)
#define GUINT_TO_POINTER (u)
#define GPOINTER_TO_UINT (p)
#define GSIZE_TO_POINTER (s)
#define GPOINTER_TO_SIZE (p)
Часто GLib, GTK+ и другие библиотеки позволяют вам помещать "пользовательские данные" в callback-функции, в форме void указателей. Время от времени вам необходимо помещать целочисленные вместо указателей. Вы можете разместить целочисленное примерно так:
int *ip = g_new (int, 1);
*ip = 42;
Но это не удобно и требует в последствии освобождать память.
Указатели имеют размер всегда 32 бита (На всех платформах.GLib подразумевает поддержку). Поэтому вы можете хранить небольшие 32-битные целочисленные значения в указателях. Вы бы могли попробовать следующий способ, но он не верен:
gpointer p;
int i;
p = (void*) 42;
i = (int) p;
Ещё раз напоминаем пример выше не правильный, не копируйте его. Проблема в том, что на некоторых системах вы должны сделать так:
gpointer p;
int i;
p = (void*) (long) 42;
i = (int) (long) p;
Поэтому GPOINTER_TO_INT()
, GINT_TO_POINTER()
, и т.д. сделают эти вещи правильно на текущей платформе.
ВЫ НЕ МОЖЕТЕ ХРАНИТЬ УКАЗАТЕЛИ В ЦЕЛЫХ ЧИСЛАХ. ЭТО НЕ ПЕРЕНОСИМО НИ В КАКОЙ ФОРМЕ. Эти макросы позволяют хранить ТОЛЬКО целочисленные в указателях, и хранят только 32 битные целочисленные; значения целочисленных за пределами диапазона 32-бит будут искажены.
#define GINT_TO_POINTER(i) ((gpointer) (i))
Помещает целочисленное в тип указателя.
Помните, ВЫ НЕ МОЖЕТЕ СОХРАНЯТЬ УКАЗАТЕЛИ В ЦЕЛОЧИСЛЕННЫХ. ЭТО НЕ ПЕРЕНОСИМЫЙ СПОСОБ ФОРМИРОВАНИЯ ИЛИ ФОРМЫ. Эти макросы позволяют хранить ТОЛЬКО целочисленные в указателях, и хранят только 32 битные целочисленные; значения целочисленных за пределами диапазона 32-бит будут искажены.
i : |
целочисленное для помещения в указатель. |
#define GPOINTER_TO_INT(p) ((gint) (p))
Извлекает целочисленное из указателя. Это целочисленное должно быть предварительно помещено
в указатель с помощью GINT_TO_POINTER()
.
Помните, ВЫ НЕ МОЖЕТЕ СОХРАНЯТЬ УКАЗАТЕЛИ В ЦЕЛОЧИСЛЕННЫХ. ЭТО НЕ ПЕРЕНОСИМЫЙ СПОСОБ ФОРМИРОВАНИЯ ИЛИ ФОРМЫ. Эти макросы позволяют хранить ТОЛЬКО целочисленные в указателях, и хранят только 32 битные целочисленные; значения целочисленных за пределами диапазона 32-бит будут искажены.
p : |
указатель содержащий целочисленное. |
#define GUINT_TO_POINTER(u) ((gpointer) (u))
Помещает целочисленное без знака в тип указателя.
u : |
целочисленное без знака для помещения в указатель. |
#define GPOINTER_TO_UINT(p) ((guint) (p))
Извлекает целочисленное без знака из указателя. Целочисленное должно быть предварительно
помещено в указатель с помощью GUINT_TO_POINTER()
.
p : |
указатель содержащий целочисленное без знака. |
#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s))
Помещает gsize в тип указателя.
s : |
gsize для помещения в указатель. |
#define GPOINTER_TO_SIZE(p) ((gsize) (p))
Извлекает gsize из указателя. Предварительно gsize должен быть помещён в указатель с помощью GSIZE_TO_POINTER()
.
p : |
указатель для извлечения gsize. |