2016-12-10 5 views
1

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:

  1. 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?

  1. Qu'est-ce que # signe avant function dans la définition macro?

  2. 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?

Répondre

1
  1. GC_CALLTYPE est dans un endroit où un spécificateur calling convention peut être (comme __stdcall). Can être parce que ne pas oublier que très facilement GC_CALLTYPE peut également développer une chaîne vide. Une recherche rapide a donné une question où cette syntaxe est abordée ici SO: How to declare an __stdcall function pointer

  2. Ceci est appelé mise en chaîne: par exemple #function sera étendu à "xyz" si l'argument macro correspondant était xyz. Plus here.

  3. Oui, il peut, dans les deux cas. Votre API vous dira comment faire la compilation pour que le programme puisse trouver la fonction. C'est tout le but d'avoir des bibliothèques et un linker.

+0

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

+0

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

+1

@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. –