Как конвертировать const void * в unsigned int? - PullRequest
0 голосов
/ 23 ноября 2018

Итак, в этом коде:

unsigned int lptr = lua_topointer(L, -1);

Выдает ошибку: невозможно преобразовать из 'const void *' в 'unsigned int'

Я попытался reinterpret_cast, чтобы преобразовать его следующим образом:

unsigned int lptr = reinterpret_cast<const void*>(lua_topointer(L, -1)));

, но это дает мне еще одну ошибку, которая говорит об этом: значение типа "const void *" не может быть использовано для инициализации сущности типа "unsigned int"

при любой помощибыл бы признателен.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Неясно, что вы подразумеваете под преобразованием пустого указателя в целое число.Если вы намереваетесь получить доступ к указанному объекту, обратитесь к документации lua_topointer:

. Преобразует значение с указанным допустимым индексом в общий указатель C (void *).Значением может быть пользовательские данные, таблица, поток или функция;в противном случае lua_topointer возвращает NULL.Разные объекты будут давать разные указатели. Невозможно преобразовать указатель обратно в исходное значение.

Обычно эта функция используется только для отладочной информации.

Также обратите внимание, что согласноВ цитируемой документации указанным объектом не может быть unsigned int.


Если вы вместо этого намереваетесь представить указатель как целое число, сначала я предлагаю вам рассмотреть , почему вамхочу сделать это.Обычно это не нужно.Наиболее разумные вещи, которые могут быть выполнены с целочисленным представлением, такие как печать, могут быть выполнены непосредственно с указателем.

Но если вы действительно хотите "преобразовать" указатель в целое число,unsigned int не является хорошим выбором, поскольку не гарантируется возможность представления всех значений, которые могут быть представлены указателем данных. std::uintptr_t может представлять все такие значения, и это будет правильным способом преобразования:

reinterpret_cast<std::uintptr_t>(data_pointer)
0 голосов
/ 23 ноября 2018

lua_topointer возвращает void const*.Ваш reinterpret_cast на самом деле ничего не меняет.Вам нужно написать:

unsigned int value = reinterpret_cast<unsigned int>(lua_topointer(L, -1)));

Но имейте в виду, что это будет работать только на платформах, где размер int соответствует размеру указателя.Вместо этого лучше использовать std::uintptr_t из <cstdint>, поскольку размер гарантированно совпадает.

std::uintptr_t value = reinterpret_cast<std::uintptr_t>(lua_topointer(L, -1)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...