extern "C" не может использоваться для классов, только для свободных функций. Таким образом, у вас есть возможность написать интерфейс «C» для вашего класса, где каждая функция берет указатель на ваш класс, и у вас, вероятно, будут функции создания и уничтожения.
Обычно это делается так, и ваш класс может быть заранее объявлен как struct, которая аналогична классу, а затем может даже использоваться приложениями, написанными на C. Обычно вы ставите только extern "C" когда __cplusplus определен так, обычно вокруг него стоят охранники #ifdef.
Существует еще один вариант, если вы хотите, чтобы ваш класс использовался только C ++, и вам не нужно писать интерфейс C для всех ваших методов класса.
Пользователи DLL используют абстрактный интерфейс и все еще используют методы Create и Destroy (с extern "C") для создания указателя на абстрактный интерфейс, но затем используют указатель обычным способом C ++. Конечно, в идеале вы должны обернуть этот указатель в умный указатель, например, повышение shared_ptr с пользовательским средством удаления, которое вызывает метод Destroy. (Пользователи библиотеки должны сделать это, но вы можете предоставить интерфейс только для заголовков, чтобы сделать это).
Есть несколько других проблем, о которых вам следует остерегаться, например, например, все, что связано с информацией о типах во время выполнения, вероятно, не будет работать на стороне пользователя, включая исключения. И снова ваша библиотека может предоставить «обертки» C ++ с открытым исходным кодом (скомпилированные на стороне клиента), чтобы обрабатывать это более C ++. Этакий pImpl.