The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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

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.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру