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 *").