2012-01-14 2 views
0

Je regardais quelques exemples de code PETSc, et je suis tombé sur cet extrait:À quoi sert __FUNCT__?

#undef __FUNCT__ 
#define __FUNCT__ "main" 

juste avant main commence.

Est-ce que le réglage __FUNCT__ ou quelque chose comme ça avant chaque fonction (ou juste?) Une convention de programmation C standard?

Si oui, pourquoi cela est-il fait?

Répondre

2

Cela semble être un raccourci ou une solution de rechange pour un compilateur C qui ne prend pas en charge la macro standard __FUNCTION__.

+0

Que fait la macro standard '__FUNCTION__'? Est-ce qu'il contient juste le nom de la fonction en cours? – Dan

+1

@Dan Oui, la macro __FUNCTION__' est automatiquement définie par le compilateur sur le nom de la fonction dans laquelle la macro est invoquée. Il est très simple d'écrire des instructions de sortie et de débogage. – hypercode

+1

'__FUNCTION__' n'est ni une macro ni une norme - elle ne peut pas être une macro car le préprocesseur ne sait rien de la sémantique du langage; C99 a introduit un identifiant prédéfini appelé '__func__' qui fait ce que l'hypercode décrit ... – Christoph

3

En regardant petsc.h, il semble y avoir un tas de macros qui passent __FUNCT__ comme paramètre à une fonction, par exemple:

#define PetscFree(a) ((a) ? ((*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__) || ((a = 0),0)) : 0) 

Je pense que PetscTrFree() (etc.) prennent ces arguments pour le débogage/buts de journalisation.

1

Première toute déclaration précédente de __FUNCT__ sont ignorés par la compilation en utilisant #undef, suivant l'identifiant est déclaré à nouveau et défini sur la chaîne « principale » dans la ligne #define __FUNCT__ "main"

Personnellement, je ne l'ai jamais vu quelqu'un faire ce paramètre à "main", je peux le voir utile si vous voulez utiliser une bibliothèque ou quelque chose mais que vous ne voulez pas utiliser leur nom de fonction déclaré bien sûr je ne sais pas pourquoi vous en feriez un identifiant au lieu de simplement créer une autre fonction prenant les mêmes paramètres et l'appelant comme vous voulez. En tout cas, je ne crois pas qu'il s'agisse d'une convention de programmation C standar et, à partir de l'extrait de code limité, on ne sait pas exactement à quoi cela sert ou pourquoi c'est fait.

3

De comments in the PETSc source code (${PETSC_DIR}/src/snes/examples/tutorials/ex3.c, lignes 33-40):

Notez qu'immédiatement avant chaque routine ci-dessous, nous définissons la __FUNCT__ macro à une chaîne contenant le nom de routine. Si elle est définie, cette macro est utilisée dans les gestionnaires d'erreurs PETSc pour fournir une traçabilité complète des noms de routine . Toutes les routines de bibliothèque PETSc utilisent cette macro et les utilisateurs peuvent éventuellement l'utiliser également dans leurs codes d'application . Notez que les utilisateurs peuvent obtenir un retraçage des erreurs PETSc indépendamment de qu'ils définissent __FUNCT__ dans les codes d'application; cette macro simplement fournit le détail de retraçage ajouté des noms de routine d'application.