Вы либо на платформе, где sizeof (Foo*) > sizeof (unsigned)
, либо ваш компилятор настроен на предупреждение о непереносимом коде.Обратите внимание, что большинство 64-битных компиляторов, как LP64, так и LLP64, попадают в эту категорию.
Нет требования, чтобы указатель помещался в int
.В этом весь смысл intptr_t
.
Если вы используете стороннюю библиотеку, которая предоставляет только int
для пользовательского контекста во время callbacls, вы можете передать индекс в таблицу поиска, поэтомусам указатель хранится в таблице поиска.Это дает дополнительное преимущество, заключающееся в том, что он безопасен для типов и не нарушает допущения по алиасингу.( Comeau "tryitout" очень удобно)
#include <stdint.h>
void myfunc(class Foo* obj)
{
uintptr_t temp = reinterpret_cast<uintptr_t>(obj);
}
Comeau C / C ++ 4.3.10.1 (6 октября 2008 11:28:09) для ONLINE_EVALUATION_BETA2 Copyright 1988-2008Comeau Computing.Все права защищены.РЕЖИМ: строгие ошибки C ++ C ++ 0x_extensions
"ComeauTest.c", строка 5: предупреждение: переменная "temp" была объявлена, но на нее никогда не ссылались uintptr_t temp = reinterpret_cast (obj); reinterpret_cast (obj);
В строгом режиме, с -tused, компиляция прошла успешно (но помните, онлайн-компилятор Comeau не связывает).Скомпилировано с включенными расширениями C ++ 0x.
В режиме C89 это также работает:
#include <stdint.h>
void myfunc(struct Foo* obj)
{
uintptr_t temp = (uintptr_t)obj;
}
Comeau C / C ++ 4.3.10.1 (6 октября 2008 г. 11:28:09) для ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing.Все права защищены.РЕЖИМ: строгие ошибки C90
"ComeauTest.c", строка 3: предупреждение: объявление не видно вне функции void myfunc (struct Foo * obj) ^
"ComeauTest.c",строка 5: предупреждение: переменная "temp" была объявлена, но на нее никогда не ссылались uintptr_t temp = (uintptr_t) obj;^
В строгом режиме с -tused, Compile успешно (но помните, онлайн-компилятор Comeau не связывает).