The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

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

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

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.


ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Оформить подписку на год


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList