C ++: Callback typedefs mit __stdcall in MSVC

8

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):

%Vor%

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?

    
George 18.08.2009, 23:12
quelle

3 Antworten

13

Ich glaube an VC ++ müssen Sie die Aufrufkonvention innerhalb der () 's setzen Hier ist ein Beispiel auf MSDN mit einer Aufrufkonvention in einem Funktionszeiger typedef.

%Vor%

Dies sollte ohne Probleme kompilieren.

    
Michael 18.08.2009, 23:24
quelle
0

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.

    
pyon 18.08.2009 23:23
quelle
0

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 sein

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

    
cmaker 29.09.2011 17:01
quelle

Tags und Links