更好地理解extern"C"函数

num*_*l25 6 c c++ visual-studio-2008 visual-studio visual-c++

我只是想进一步了解extern C函数.

根据我的知识,extern C函数始终是您正在尝试从已编译的应用程序调用的函数.可执行文件,静态库或动态库.

extern "C" 
{
   HRESULT CreateDevice();
   typedef HRESULT (*CREATEDEVICE)();

   HRESULT ReleaseDevice();
   typedef HRESULT (*RELEASEDEVICE)();
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是......

我的理解是否正确?

它总是必须是一个C函数指针??'

为什么必须为每个函数使用typedef?

我假设你使用GetProcAddress().您正在为特定应用程序HEAP分配内存,而不是您从中调用它的内存.因此你必须从那个堆中释放它?

EMP*_*EMP 1

它不一定是函数指针。您可以正常指定函数声明并在其前面加上 前缀extern "C",如下所示,如某些 Microsoft 示例

如果你使用GetProcAddress()则不会分配任何内存。您只需获取已加载到内存中的 DLL 内函数的内存地址(大概是LoadLibrary())。

即使使用函数指针(例如 GetProcAddress 返回的函数指针),您也不必使用typedef只是如果没有它,代码看起来相当难看。也总是很难弄清楚要写什么。我认为它会是这样的:

void (*pReleaseDevice)() = (void (__cdecl *)(void))GetProcAddress(hInstance, "ReleaseDevice");
Run Code Online (Sandbox Code Playgroud)

  • @Billy ONeal:“GetProcAddress”和 Visual Studio 也是如此。 (2认同)