Преобразование указателя в целое число: еще раз для 64-битных машин
В C/C потенциальная ловушка при работе с 64-битными машинами битовых машин возникает при работе с указателями. Традиционные методы преобразования, такие как показанный ниже, могут привести к ошибкам точности:
void function(MESSAGE_ID id, void* param) { if (id == FOO) { int real_param = (int)param; // ... } }
Решение с обновленными методами приведения типов
Чтобы устранить эту проблему и обеспечить полную совместимость как с 32-битными, так и с 64-битными системами, рекомендуется использовать современный подход C:
#includevoid *p; auto i = reinterpret_cast<:uintptr_t>(p);
Выбор правильного типа данных
При сохранении указателя как целого числа крайне важно выбрать соответствующий тип данных. Для этой цели наиболее подходит тип uintptr_t.
// C 11 std::uintptr_t i; // C 03 extern "C" { #include} uintptr_t i; // C99 #include uintptr_t i;
Использование правильного оператора приведения
В C существуют различные типы приведения. Для этого конкретного сценария reinterpret_cast является наиболее подходящим выбором.
// C 11 auto i = reinterpret_cast<:uintptr_t>(p); // C 03 uintptr_t i = reinterpret_cast(p); // C uintptr_t i = (uintptr_t)p;
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3