J'utilise des bibliothèques standard pour développer une interface générale pour certains périphériques. Dans une partie du code que j'aiEst-ce que cela déclare toujours un alias pour un type de fonction de pointeur?
//header.h
#ifndef _M_X64
# define GC_CALLTYPE __stdcall
#else
# define GC_CALLTYPE /* default */ //this is my case
#endif
...
typedef int32_t GC_ERROR;
...
/* typedefs for dynamic loading */
#define GC_API_P(function) typedef GC_ERROR(GC_CALLTYPE *function)
GC_API_P(PTLOpen)(TL_HANDLE *phTL);
et dans mes fichiers source Je
//source1.cpp
TLOpen(&hTl)
//source2.cpp
#define FUNCTION_POINTER(function, ptype, hModule) \
((function) = reinterpret_cast<ptype>(GetProcAddress((hModule), #function))) // What is this #?
GC::PTLOpen TLOpen = 0;
FUNCTION_POINTER(TLOpen, GC::PTLOpen, hModule);
Je veux savoir:
- Quelle est la déclaration
TLopen()
? Je l'ai remplacé macros et obtenu ceci:
typedef int32_t(GC_CALLTYPE *PTLOpen )(TL_HANDLE *phTL);
Mais j'ai appris des pointeurs différemment et je m'y attendais quelque chose comme cette fonction:
typedef int32_t(*PTLOpen )(TL_HANDLE *phTL);
La déclaration ci-dessus il encore un pointeur de fonction ? Qu'en est-il de GC_CALLTYPE
?
Qu'est-ce que
#
signe avantfunction
dans la définition macro?Où est le corps de la fonction
TLopen()
? J'ai quelques fichiers.lib
et.dll
à inclure. Le corps peut-il exister dans ces fichiers sous forme compilée?
Ceci est toujours une déclaration de pointeur de fonction. Veuillez noter que dans mon cas '_M_X64' est défini et' #define GC_CALLTYPE', donc 'GC_CALLTYPE' n'est qu'une macro! Comment ça marche? – GntS
Je suis également curieux de savoir s'il existe un moyen de détecter dans quel fichier '.lib' le corps d'une fonction particulière existe. En d'autres termes, existe-t-il un moyen de trouver que, par exemple, 'func1' est défini dans' .lib3' ou 'func3' dans' .lib2'? – GntS
@GmtK Désolé, j'ai oublié le "ceci est mon cas". C'est encore plus simple: après le passage du préprocesseur, le compilateur ne verra que 'typedef int32_t (* PTLOpen) (TL_HANDLE * phTL);'. L'expansion '/ * default * /' est aussi bon que l'espace blanc, et est effectivement remplacé par cela. –