typedef 在 C++ 中在其他人的 .h 头文件中声明的函数



我使用的是Visual Studion 2010,并给出了从WinGDI.h获得的以下示例函数:

__gdi_entry WINGDIAPI int WINAPI AbortDoc(__in HDC hdc);

有没有办法声明这种类型的函数指针,或者把它放在typedef中。例如:

AbortDoc() MyAbortDocPtr;
typedef AbortDoc AbortDocType;

很明显,这些语法不正确,不会编译,也许我想做的事情根本做不到。然而,有一种解决方案,你可以自己动手干扰每个typedef,如下所示:

typedef int (WINAPI *AbortDocType)( HDC hdc );

我用过这个,它确实对我有用,但是。。。。

  • 它很乏味,尤其是如果你要做100个例程
  • 因为它很乏味,很容易出错,而且你可能会得到一个错误的签名,直到边缘案例执行了错误的代码才知道
  • 如果头文件中的基本签名发生变化,您有责任找出哪些签名发生了变化并进行更正。这意味着手工检查所有例程,而不是只获取新的头文件并重新编译

有人知道如何在typdfs中使用预定义的函数声明,或者简单地将原始声明用作typedef来声明新的函数指针吗

您可以使用decltype来推导函数指针的类型。

#include <iostream>
#include <Windows.h>
#include <WinGDI.h>
typedef decltype(&AbortDoc) AbortDocType1;
typedef __gdi_entry WINGDIAPI int (WINAPI *AbortDocType2)( HDC hdc );
int main()
{
  std::cout << typeid(AbortDocType1).name() << std::endl;
  std::cout << typeid(AbortDocType2).name() << std::endl;
}

输出:

int (__stdcall*)(struct HDC__ *)
int (__stdcall*)(struct HDC__ *)

如果使用GCC或clang,则可以使用typeof:

typedef typeof(&AbortDoc) AbortDocType;

最新更新