Вопрос об экспорте класса C в C

#c #c

#c #c

Вопрос:

Я читал об экспорте класса C , чтобы C мог его использовать. Я последовал этому хорошему примеру из Parashift, и возник вопрос.

Для хранения памяти, выделенной классу C , мы определяем следующую структуру

 typedef struct A A;
  

Чтобы это A* могло указывать на адрес класса A. Мой вопрос таков: имеет ли значение, к какому типу относится этот указатель? Например, не могли бы мы ввести defчто-то вроде:

 typedef double A;
  

Поскольку, вероятно, именно код C будет отвечать за выделение и освобождение памяти.

Ответ №1:

Нет, вы не должны использовать void* это. Указатель на неполный тип struct A — гораздо лучший метод. Это позволяет избежать случайного смешивания указателей на разные непрозрачные типы. При typedef желании void вы могли бы присвоить указатель вашего непрозрачного типа любому другому указателю на данные. Вероятно, это не то, чего ты хочешь.

Использование неполного типа дает вам некоторую безопасность типов без каких-либо затрат вообще.

Ответ №2:

Непрозрачные указатели лучше всего объявлять как void* .

Это часто известно как идиома Pimpl.

Ответ №3:

Вы должны использовать void тип для всего, что должно быть непрозрачным, как это. Использование typedef неопределенной структуры нормально, поскольку ее имя может дать вам представление о том, на что оно действительно указывает.

Комментарии:

1. @Nim Это верно, void на самом деле это не тип как таковой. Например, вы не можете объявить переменную типа void .