我看到了一个使用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
?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问题提到了上面列出的“外部” C” has the effect of resolving name mangling. However, they don't address the issues of
虚拟,
布尔,私有数据等。
此外,许多与DLL相关的答案建议不要使用非POD结构,因为布局可能在编译器(包括相同版本的编译器)之间改变;因此,例如,字符数组优于std::string
。
答案 0 :(得分:1)
它不会将代码更改为C。它不会导致C ++名称修改发生-因此,例如,您不能在该块内重载显示为extern "C"
的函数,但是代码仍然是C ++。
您仅被限制执行无法从C调用的操作(在extern "C"
块中)。您正在公开C API,但仍可以在后台使用C ++。只是不在您的extern "C"
接口的部分中。
这也意味着您不能将成员函数(是否为virtual
导出为extern "C"
,因为C没有这样的东西。