外部 "C" 与 class 和 DLL
extern "C" with class and DLL
我看到了使用 extern "C"
:
的 C++ DLL 源代码
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;
};
}
C++ 程序正在调用 DLL。
仅供参考,在 Windows 7 平台上使用 Visual Studio 2017。
问题 *(全部与 extern "C"
和 class
相关):
- 因为
class
不是C语言,这样会不会等同于一个
struct
?
- 构造函数有效吗?
- 虚拟析构函数是否有效(因为 C 没有
virtual
)?
- 如何处理
bool
?
static
在 class 的 extern "C"
中如何处理?
- 如何在
extern "C"
块内处理 private
数据?
- 如何在
extern "C"
块中处理 noexcept
构造函数?
Visual Studio 2017 编译器不会为上述代码生成任何错误或警告。
VS2017 代码分析器只为构造函数生成警告:
C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).
研究:
Whosebug 上与此问题相关的问题提到 "extern "C"has the effect of resolving name mangling. However, they don't address the issues of
virtual,
bool`、私有数据等,如我上面所列。
此外,许多与 DLL 相关的答案建议不要使用非 POD 结构,因为布局可能会在编译器之间发生变化(包括相同版本的编译器);例如,字符数组优于 std::string
。
它不会将代码更改为 C。它不会导致完成任何 C++ 名称修改 - 因此您不能在该块内重载公开为 extern "C"
的函数,例如,但代码仍然C++。
你只是被限制做一些不能从 C 调用的东西(在 extern "C"
块中)。你公开了一个 C API 但你仍然可以在幕后使用 C++。只是不在您的 extern "C"
界面部分 .
这也意味着您不能将成员函数(virtual
或不)导出为 extern "C"
因为 C 没有这样的东西。
我看到了使用 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;
};
}
C++ 程序正在调用 DLL。 仅供参考,在 Windows 7 平台上使用 Visual Studio 2017。
问题 *(全部与 extern "C"
和 class
相关):
- 因为
class
不是C语言,这样会不会等同于一个struct
? - 构造函数有效吗?
- 虚拟析构函数是否有效(因为 C 没有
virtual
)? - 如何处理
bool
? static
在 class 的extern "C"
中如何处理?- 如何在
extern "C"
块内处理private
数据? - 如何在
extern "C"
块中处理noexcept
构造函数?
Visual Studio 2017 编译器不会为上述代码生成任何错误或警告。
VS2017 代码分析器只为构造函数生成警告:
C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).
研究:
Whosebug 上与此问题相关的问题提到 "extern "C"has the effect of resolving name mangling. However, they don't address the issues of
virtual,
bool`、私有数据等,如我上面所列。
此外,许多与 DLL 相关的答案建议不要使用非 POD 结构,因为布局可能会在编译器之间发生变化(包括相同版本的编译器);例如,字符数组优于 std::string
。
它不会将代码更改为 C。它不会导致完成任何 C++ 名称修改 - 因此您不能在该块内重载公开为 extern "C"
的函数,例如,但代码仍然C++。
你只是被限制做一些不能从 C 调用的东西(在 extern "C"
块中)。你公开了一个 C API 但你仍然可以在幕后使用 C++。只是不在您的 extern "C"
界面部分 .
这也意味着您不能将成员函数(virtual
或不)导出为 extern "C"
因为 C 没有这样的东西。