2009-05-25 3 views

Répondre

3

si vous voulez une solution rapide et sale pour ce faire des macros pré-processeur comme celui-ci ...

#define FUNCTION_HEADER(a) a { const char* __func__ = #a; 
#define FUNCTION_FOOTER() } 

... et l'utiliser pour vos en-têtes et pieds de page de fonction comme celle-ci (testé avec VS 2008):

#include <windows.h> 

#define FUNCTION_HEADER(a) a { const char* __func__ = #a; 
#define FUNCTION_FOOTER() } 

FUNCTION_HEADER(int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)) 
    MessageBoxA(0, __func__, __func__, MB_OK); 
    return 0; 
FUNCTION_FOOTER() 

Cela devrait fonctionner exactement comme vous le souhaitez, mais c'est moche.

+0

Ugly en effet, mais fait le travail :-) –

5

Non, la norme C99 a les éléments suivants:

6.10.8 noms macro

pré-définies

Les noms de macro suivant est définie par la mise en œuvre:

__DATE__ 
__FILE__ 
__LINE__ 
__STDC__ 
__STDC_HOSTED__ 
__STDC_MB_MIGHT_NEQ_WC__ 
__STDC_VERSION__ 
__TIME__ 

Les noms de macro suivants sont conditionnellement définis par l'implémentation:

__STDC_IEC_559__ 
__STDC_IEC_559_COMPLEX__ 
__STDC_ISO_10646__ 

6.4.2.2 identifiants prédéfinis

L'identifiant __func__ est déclaré implicitement par le traducteur comme si, immédiatement après l'accolade d'ouverture de chaque définition de fonction, la déclaration

 static const char __func__[] = "function-name"; 

est apparu, où nom-fonction est le nom du dictionnaire lexical-enc gcc ajoute extensions, comme j'imagine d'autres compilateurs.