Ваш код не работает. Он не станет менее сломанным, если игнорировать предупреждения, которые дает вам компилятор.
Как вы думаете, произойдет, если вы попытаетесь сохранить 64-битный указатель в 32-битное целое число? Половина ваших данных будет выброшена. Я не могу представить много случаев, когда это правильно или где это не вызовет ошибок.
Исправьте свой код. Или оставайтесь на 32-битной платформе, на которой сейчас работает код.
Если ваш компилятор определяет intptr_t
или uintptr_t
, используйте их, поскольку они представляют собой целочисленные типы, которые гарантированно будут достаточно большими для хранения указателя.
Если эти типы недоступны, size_t
или ptrdiff_t
также достаточно велики, чтобы содержать указатель на большинстве (не на всех) платформах. Или используйте long
(обычно 64-битный на 64-битных платформах в компиляторе GCC) или long long
(тип C99, который большинство, но не все компиляторы, поддерживают в C++), или какой-либо другой целочисленный тип, определяемый реализацией, который, по крайней мере, Ширина 64 бита на 64-битной платформе.
person
jalf
schedule
08.01.2010
intptr_t
. - person GManNickG   schedule 10.01.2010void*
является указателем на адресное пространство, потоки или что-то подобное, эти ошибки должны быть исправлены. Однако есть также случаи, когда известно, что преобразование работает, например. если человек сначала преобразуетint
вvoid*
, а затем хочет преобразовать обратно. Это полностью переносимо (см. документацию поreinterpret_cast
). Ответы здесь до сих пор не имеют адекватной поддержки для такой ситуации.int i2 = *((int*)&v);
как заявил erco, это начало, но является ли это оптимальным решением? - person Cookie   schedule 28.06.2012