Мне был представлен исходный код C ++ DLL, который использует extern "C"
:
extern "C"
{
class Something
{
public:
__declspec(dllexport) Something();
__declspec(dllexport) virtual ~Something();
__declspec(dllexport) bool function_one(const char * some_text);
static __declspec(dllexport) char * get_version();
private:
unsigned int m_data;
};
}
DLL вызывается программой на C ++.
К вашему сведению, используя Visual Studio 2017 на платформе Windows 7.
Вопросы * (все относящиеся к extern "C"
и class
):
- Поскольку
class
не является языком C, это будет эквивалентно
struct
- Допустимы ли конструкторы?
- Действительны ли виртуальные деструкторы (поскольку C не имеет
virtual
)?
- Как обрабатывается
bool
?
- Как
static
обрабатывается внутри extern "C"
для класса?
- Как обрабатываются данные
private
внутри блока extern "C"
?
- Как обрабатывается
noexcept
в блоке extern "C"
для
конструктор?
Компилятор Visual Studio 2017 не генерирует никаких ошибок или предупреждений с помощью приведенного выше кода.
Анализатор кода VS2017 генерирует только предупреждение для конструктора:
C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).
Исследование:
В вопросах StackOverflow, связанных с этой проблемой, упоминается, что "extern" C "has the effect of resolving name mangling. However, they don't address the issues of
virtual ,
bool`, личные данные и т. Д., Как я перечислил выше.
Кроме того, во многих ответах, связанных с DLL, рекомендуется не использовать структуры, отличные от POD, поскольку компоновка может меняться в разных компиляторах (включая одни и те же версии компиляторов); так, например, символьные массивы предпочтительнее, чем std::string
.