Я работаю с устаревшим интерфейсом библиотеки C (на С++), который предоставляет непрозрачные указатели как
typedef void * OpaqueObject
В библиотеке:
OpaqueObject CreateObject()
{
return new OurCppLibrary::Object();
}
Это, конечно, не обеспечивает абсолютно никакой безопасности типов для клиентов этой библиотеки. Должно ли изменение typedef с указателя void на указатель структуры работать точно так же, но обеспечивать небольшую безопасность типов?
typedef struct OpaqueObjectInternal_ *OpaqueObject
// OpaqueObjectInternal_ is NEVER defined anywhere in client or library code
Есть ли какие-либо проблемы с выравниванием или другие ошибки, о которых мне нужно беспокоиться сейчас, когда я явно указываю на структуру, хотя на самом деле я не указываю на нее?
new
!! - person Mahesh   schedule 15.03.2011new
имеет место в C++ (выведено из квалификатораOurCppLibrary
) - person fbrereto   schedule 15.03.2011void *
имеет смысл как непрозрачный объект — ваша цель не связываться с объектом, и они знают, что с ним делать. Во всяком случае, созданиеvoid *
делает его более безопасным, если вы просто используете его с их API, как описано. - person James   schedule 15.03.2011void some_api_func(void*); int* i = ...; some_api_func(i); // oops!
. Этого не может быть с безопасностью типов. - person GManNickG   schedule 15.03.2011void *
, таких иллюзий нет. - person James   schedule 15.03.2011OpaqueObject
по значению вашим функциям, которые содержат указатель внутри, и переадресовывает вызов метода. Затем компилятор должен поймать любые ошибки типа. - person James   schedule 15.03.2011void *
непрозрачными объектами и никогда не передавал неверный тип. Возможно, это мой опыт затуманивает мое представление об уровне безопасности, но я видел, что такая незначительная проблема, как правильное имя переменной, обычно предотвращает передачу неправильного указателя. Несмотря на это, см. Мой второй комментарий выше, чтобы узнать, что я считаю лучшим решением. - person James   schedule 15.03.2011