Макросы преобразования типов

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-бит будут искажены.

Детали

GINT_TO_POINTER()

#define GINT_TO_POINTER(i) ((gpointer) (i))

Помещает целочисленное в тип указателя.

Помните, ВЫ НЕ МОЖЕТЕ СОХРАНЯТЬ УКАЗАТЕЛИ В ЦЕЛОЧИСЛЕННЫХ. ЭТО НЕ ПЕРЕНОСИМЫЙ СПОСОБ ФОРМИРОВАНИЯ ИЛИ ФОРМЫ. Эти макросы позволяют хранить ТОЛЬКО целочисленные в указателях, и хранят только 32 битные целочисленные; значения целочисленных за пределами диапазона 32-бит будут искажены.

i : целочисленное для помещения в указатель.

GPOINTER_TO_INT()

#define GPOINTER_TO_INT(p) ((gint) (p))

Извлекает целочисленное из указателя. Это целочисленное должно быть предварительно помещено в указатель с помощью GINT_TO_POINTER().

Помните, ВЫ НЕ МОЖЕТЕ СОХРАНЯТЬ УКАЗАТЕЛИ В ЦЕЛОЧИСЛЕННЫХ. ЭТО НЕ ПЕРЕНОСИМЫЙ СПОСОБ ФОРМИРОВАНИЯ ИЛИ ФОРМЫ. Эти макросы позволяют хранить ТОЛЬКО целочисленные в указателях, и хранят только 32 битные целочисленные; значения целочисленных за пределами диапазона 32-бит будут искажены.

p : указатель содержащий целочисленное.

GUINT_TO_POINTER()

#define GUINT_TO_POINTER(u) ((gpointer) (u))

Помещает целочисленное без знака в тип указателя.

u : целочисленное без знака для помещения в указатель.

GPOINTER_TO_UINT()

#define GPOINTER_TO_UINT(p) ((guint) (p))

Извлекает целочисленное без знака из указателя. Целочисленное должно быть предварительно помещено в указатель с помощью GUINT_TO_POINTER().

p : указатель содержащий целочисленное без знака.

GSIZE_TO_POINTER()

#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s))

Помещает gsize в тип указателя.

s : gsize для помещения в указатель.

GPOINTER_TO_SIZE()

#define GPOINTER_TO_SIZE(p) ((gsize) (p))

Извлекает gsize из указателя. Предварительно gsize должен быть помещён в указатель с помощью GSIZE_TO_POINTER().

p : указатель для извлечения gsize.