我只是想进一步了解 extern C 函数。
据我所知,extern C 函数始终是您尝试从已编译的应用程序调用的函数。可执行文件、静态或动态库。
extern "C"
{
HRESULT CreateDevice();
typedef HRESULT (*CREATEDEVICE)();
HRESULT ReleaseDevice();
typedef HRESULT (*RELEASEDEVICE)();
}
所以我的问题是...
我的理解对吗??
它总是必须是 C 函数指针吗??'
为什么必须为每个函数使用 typedef ??
我假设当您使用 GetProcAddress() 时。您正在为特定应用程序 HEAP 而不是您从中调用它的应用程序分配内存。因此,您也必须从该堆中释放它??
最佳答案
extern "C"有两个含义。首先,它声明函数的符号名称不是“名称损坏”以支持 C++。其次,它告诉编译器该函数是使用 C 调用约定而不是 PASCAL 调用约定调用的。区别与返回地址何时压入堆栈有关。使用错误的调用约定会使您的应用崩溃。
此声明适用于编译器,而非链接器。因此 extern C 函数可以存在于您自己的模块或二进制库中:函数实现的实际字节源由链接器解析。如果函数签名被声明为常规 C++ 函数而不是 extern C,编译器将破坏符号名称以对函数签名中的类型信息进行编码。这将使它与其他 C++ 编译器生成的目标代码不兼容。因此,创建一个 extern C 函数允许您以二进制形式在编译器之间共享代码。请注意,您不能以这种方式公开成员函数,只能公开旧式 C 函数。
关于c++ - 更好地理解 extern "C"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971327/