2014-10-14 3 views
0

Я пытаюсь создать пустоту * от междунар. Но gcc всегда предупреждает меня, что я не могу использовать int для void *. Вот мой код:Cast ИНТ к мочеиспусканию *

#define M_TABLE_SIZE 64*1024 
static const void* M_OFFSET = M_TABLE_SIZE; 

Я уже пытался (void*)M_TABLE_SIZE, но потом я получаю сообщение об ошибке, что я не могу использовать оператор *.

Что такое правильный способ бросить Int к ничтожной *?

+0

Может быть полезно для вас. [Что означает преобразование int в void * или наоборот?] (Http://stackoverflow.com/questions/8618637/what-does-it-mean-to-convert-int-to-void-or-vice -versa) – user1336087

+5

Я пытаюсь создать сырный пирог из загрузки ковша бензина. Но моя жена всегда предупреждает меня, что я не могу поставить бензин в духовку. Я также пытался разминать бензин прямо руками, но тогда я не могу получить желаемую текстуру пирога с сыром. Каков правильный метод превращения бензина в сырный пирог? –

+1

'static const void * M_OFFSET = (void *) (M_TABLE_SIZE);' – BLUEPIXY

ответ

5

Этот

static const void* M_OFFSET = (void*)M_TABLE_SIZE; 

расширяется до

static const void* M_OFFSET = (void*)64*1024; 

Поскольку GCC компилирует, что вы выполняете арифметические операции между void* и Int (1024). Поместите ваш определить внутри кронштейна:

#define M_TABLE_SIZE (64*1024) 

Теперь вы можете сделать:

static const void* M_OFFSET = (void*) M_TABLE_SIZE; 

без проблем. Это всегда хорошая практика поставить ваши #define в скобках, чтобы избежать такого удивления.

Если у вас нет действительного адреса при этом значении, вы будете вызывать неопределенное поведение при попытке использовать этот указатель. Поэтому убедитесь, что вы понимаете, что делаете!

+2

Я предполагаю, что другой важный факт заключается в том, что оператор литья имеет более высокий приоритет, чем оператор умножения –

+0

@BlueMoon Большое спасибо! Я предположил, что gcc делает 65536 из моего определения, но я ошибся. – kaetzacoatl

0

Сначала вы используете определить, что не является переменной. Препроцессор заменит ваш код следующим образом:

static const void* M_OFFSET = 64*1024; 

Это маловероятно, что вы пытаетесь сделать.

Вы можете объявить константную переменную INT и бросьте ссылку на нее в пустоту *.

+2

Препроцессор абсолютно не выполнит арифметику –

+0

Вы правы! Спасибо что подметил это. Просто отредактирован. Тем не менее, я считаю, что даже если определение было для «65536», это не то, что хотел @kaetzacoatl. – fhsilva

0

Для сравнительно недавно компилятора (который поддерживает C99) вы не должны хранить или представлять адрес в качестве простого int значения. Если вам действительно нужна такая обманка, тогда рассмотрите один из выделенных типов, которые являются intptr_t и uintptr_t. Ссылаясь на N1570 7.20.1.4/p1 (целочисленные типы, способные удерживать объект указатели):

Следующий тип обозначает целочисленный тип со свойством , что любой допустимый указатель на аннулированию могут быть преобразованы к этому типу, то преобразуется обратно в указатель к мочеиспусканию, и результат будет сравнивать равные к исходному указателю:

intptr_t

следующий тип обозначает целое число без знака типа с свойством, что любой допустимый указатель к мочеиспусканию могут быть преобразованы в этом т ип, затем преобразуется обратно в указатель на пустоту, и результат будет сравнивать , равную первоначальной указатель:

uintptr_t

Эти типы не являются обязательными.

В вашем случае это может быть:

#include <stdint.h> 

#define M_TABLE_SIZE ((intptr_t) (64*1024)) 
static const void* M_OFFSET = (void *) M_TABLE_SIZE; 
Смежные вопросы