Dieser Typdef:
%Vor% kompiliert in BorlandCpp, aber wenn ich es in msvc kompiliere, muss ich WINAPI
entfernen (was nur ein Alias für __stdcall
ist):
Warum passiert das? Kann ich den WINAPI-Teil sicher entfernen?
Update : Ich musste "WINAPI" aus dem typedef entfernen, sonst habe ich
%Vor%für die Linie.
Können Sie mir sagen, warum Borland es mit "WINAPI" kompilieren konnte, während Msvc nicht konnte?
Ein Funktionszeiger muss Informationen über die von der Funktion verwendete Aufrufkonvention enthalten. Wenn Sie auf eine Funktion verweisen, die die Aufrufkonvention __cdecl verwendet, müssen Sie einen Funktionszeiger __cdecl verwenden. Wenn Sie auf eine Funktion verweisen, die die Aufrufkonvention __stdcall verwendet, müssen Sie den Funktionszeiger __stdcall verwenden.
Hoffe, das hilft.
Seitennotiz: Ich glaube, dass Funktionssignatur typedefs nie als Zeiger typedefs ausgedrückt werden sollte.
Wenn Sie CM_Open_DevNode_Key als Nicht-Zeiger definiert haben, könnte jede Header-Deklaration einer Funktion, die dieser Callback-Signatur folgen soll, einfach als
geschrieben worden seinCM_Open_DevNode_Key myFunc;
statt einer zu ausführlichen / fehleranfälligen
DWORD WINAPI myFunc (DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);
Dies würde bei Bedarf viel einfacheren Code und eine viel spezifischere Übereinstimmung von Funktionssignaturen ermöglichen.
Ganz zu schweigen davon, dass Pointer typedefs im Allgemeinen böse sind, da sie die Spezifizierung der Konstanz des Inhalts nicht zulassen (berüchtigtes Beispiel: "const PCHAR" vs. korrekt evaluiertes "const CHAR * ").
Tags und Links c++ visual-c++ typedef