2009-08-18 13 views
8

Ten typedef:C++: typedefs oddzwonienia z __stdcall w MSVC

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

kompiluje grzywny w BorlandCpp jednak, kiedy go skompilować w MSVC muszę usunąć WINAPI (który jest tylko aliasem __stdcall):

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

Dlaczego tak się dzieje? Czy mogę bezpiecznie usunąć część WINAPI?

Aktualizacja: Musiałem usunąć "WINAPI" tworzyć typedef, inaczej mam

error C2059: syntax error : '(' 

na linii.

Czy możesz mi powiedzieć, dlaczego Borland mógłby skompilować go z "WINAPI", podczas gdy Msvc nie mógł?

+0

Przepraszamy, teraz jest uwzględniony. – George

Odpowiedz

13

Wierzę w VC++, że musisz umieścić konwencję wywołania wewnątrz() ''s Here example na MSDN z użyciem konwencji wywoływania wewnątrz wskaźnika funkcji typedef.

To powinno się bezproblemowo skompilować.

+0

Dziękuję, ten działa:) – George

0

Wskaźnik funkcji musi zawierać informacje o konwencji wywołania używanej przez funkcję. Jeśli wskazujesz funkcję korzystającą z konwencji wywoływania __cdecl, musisz użyć wskaźnika funkcji __cdecl. Jeśli wskażesz funkcję korzystającą z konwencji wywołującej __stdcall, musisz użyć wskaźnika funkcji __stdcall.

Mam nadzieję, że to pomoże.

0

marginesie: Wierzę funkcyjne typedefs podpis powinien nigdy być wyrażony jako wskaźnik typedefs.

Gdybyś zdefiniowane CM_Open_DevNode_Key być non-pointer, każda deklaracja nagłówek funkcji, która ma śledzić ten podpis zwrotnej może po prostu zostały napisane jako

CM_Open_DevNode_Key myFunc;

zamiast nadmiernie rozwlekły/podatne na błędy

DWORD WINAPI myFunc (DWORD DWORD DWORD DWORD PHKEY, słowa);

Pozwoliłoby to na znacznie prostszy kod i o wiele dokładniejsze dopasowanie sygnatur funkcji, w razie potrzeby.

nie wspominając, że typedefs wskaźnika są złe w ogóle, ponieważ DIS-umożliwić określenie constness z zawartości wskazywanego (niesławny przykład: „const PChar” kontra właściwie oceniana „const char *”).