typedef在c ++中用别人的.h头文件声明的函数

时间:2012-03-14 17:26:33

标签: c++ function-pointers typedef

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

__gdi_entry WINGDIAPI int WINAPI AbortDoc(__in HDC hdc);

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

AbortDoc() MyAbortDocPtr;

typedef AbortDoc AbortDocType;

显然这些语法在语法上是不正确的,并且不会编译,也许我想要完全不能完成。但是,有一种解决方案,您可以按照以下方式手动阻塞每个类型的设备:

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

我已经习惯了这个,它对我有用,但是....

  • 它很乏味,特别是如果你正在为100个例程做这件事。
  • 因为它很容易出错,并且你可能会收到签名错误而且在边缘情况执行错误代码之前不知道它。
  • 如果基本签名在头文件中发生变化,您有责任找出哪些更改并进行更正。这意味着手动检查所有例程,只需抓取新的头文件并重新编译。

任何人都知道如何在typdef中使用预定义的函数声明,或者只是将原始声明用作typedef来声明一个新的函数指针?

2 个答案:

答案 0 :(得分:2)

如果您使用的是GCC或clang,则可以使用typeof

typedef typeof(&AbortDoc) AbortDocType;

答案 1 :(得分:2)

您可以使用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__ *)