C++: обратный вызов typedefs с stdcall в MSVC

Это typedef:

typedef DWORD WINAPI
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

компилирует отлично в BorlandCpp, однако, когда я компилирую его в msvc, я должен удалить WINAPI (это просто псевдоним для __stdcall):

typedef DWORD
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

почему это происходит? Могу ли я безопасно удалить часть WINAPI?

обновление: мне пришлось удалить "WINAPI" из формы typedef, иначе я получил

 error C2059: syntax error : '('

для строки.

можете ли вы сказать мне, почему Borland может скомпилировать его с помощью " WINAPI" в то время как Msvc не мог?

3 ответов


Я считаю, что на VC++ вам нужно поместить соглашение о вызове внутри () вот пример на MSDN использования соглашения о вызове внутри указателя функции typedef.

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

Это должно компилироваться без проблем.


указатель на функцию должен иметь информацию о вызовах используется функция. Если вы указываете на функцию, использующую соглашение о вызове __cdecl, необходимо использовать указатель на функцию __cdecl. Если вы указываете на функцию, использующую соглашение о вызове __stdcall, необходимо использовать указатель на функцию __stdcall.

надеюсь, что это помогает.


примечание: Я считаю, что сигнатура функции typedefs должна никогда выражается как указатель typedefs.

Если бы вы определили CM_Open_DevNode_Key как non-pointer, любое объявление заголовка функции, которая должна следовать этой подписи обратного вызова, могло бы быть просто написано как

CM_Open_DevNode_Key myFunc;

а не слишком многословный / ошибки

DWORD WINAPI myFunc(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

Это позволило бы гораздо более простой код и гораздо более конкретное сопоставление сигнатур функций, если это необходимо.

не говоря уже о том, что указатели типа являются злыми вообще, так как они не позволяют указать константу контент указывается (печально известный пример:" const PCHAR "против правильно оцененного" const CHAR *").