typedef - функция, объявленная в чужом заголовочном файле .h на c ++ - PullRequest
2 голосов
/ 14 марта 2012

Я использую Visual Studion 2010 и получил следующий пример функции, полученный из WinGDI.h:

__gdi_entry WINGDIAPI int WINAPI AbortDoc(__in HDC hdc);

Есть ли способ объявить указатель на функцию этого типа, или, возможно, поместить его в определение типа. Например:

AbortDoc() MyAbortDocPtr;

typedef AbortDoc AbortDocType;

Очевидно, что они не являются синтаксически правильными и не будут компилироваться, и, может быть, я хочу, чтобы я вообще не мог этого сделать. Тем не менее, существует решение, в котором вы можете вручную заклинить каждый typedef следующим образом:

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

Я использовал это, и оно работает для меня, но ....

  • Это утомительно, особенно если вы делаете это для 100 процедур.
  • Потому что это утомительно и подвержено ошибкам, и вы могли бы ошибиться в подписи и не знать ее, пока не обработает ошибочный код случайный случай.
  • В случае изменения базовых подписей в заголовочном файле вы несете ответственность за выяснение того, какие из них были изменены, и исправление их. Это означает ручную проверку всех подпрограмм и просто захват нового заголовочного файла и перекомпиляцию.

Кто-нибудь знает, как я могу использовать предопределенные объявления функций в typedefs или просто использовать исходное объявление как typedef для объявления нового указателя функции?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вы можете использовать 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__ *)
2 голосов
/ 14 марта 2012

Если вы используете GCC или clang, вы можете использовать typeof:

typedef typeof(&AbortDoc) AbortDocType;
...