c++ - 更好地理解 extern "C"函数

标签 c++ c visual-studio visual-studio-2008 visual-c++

我只是想进一步了解 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/

相关文章:

C:尝试从文件中读取浮点字符

c# - 用 C# 创建 Form2 并对其进行编辑

c++ - 从 D3DX 转换过来,找不到 D3DCompile

c++ - _BitScanForward64 在 c++.exe (rubenvb-4.7.2-release) 中返回错误答案

c++ - 为什么我得到未引用的局部变量

c++ - 使类对 C++ 中的其他类公开

wpf - 如何让 MSIX 应用安装程序在每次生成/发布期间输出正确的设置?

c++ - 复制一个句柄然后关闭原来的句柄

c - 如何将二进制转换为十进制?

std::find 的 C 等效项