![]() ![]() ![]() |
|
L a n g a g e C
L e s m a c r o s
Définition et invocation
Une macro n'est rien d'autre qu'un symbole dont la valeur est paramétrable :
L'invocation de la macro est similaire à l'appel d'une fonction :
On gagne ici le temps et le code qui auraient été nécessaires à l'appel d'une fonction. Par contre, la macro est développée à chaque invocation, ce qui augmente la taille de l'exécutable en fonction du nombre d'utilisations.
Par sécurité l'écriture des macros se fera en entourant les paramètres par des parenthèses dans l'expression :
Macros et fonctions
Les macros offrent une certaine souplesse par rapport aux fonctions. Par exemple, la macro SIGNE définie ci-dessus fonctionne pour tout type d'argument accepté comme opérande de <. Les mots clés peuvent être manipulés comme toute autre chaîne de caractères :
Par exemple pour contrôler que la mémoire est disponible lors d'une allocation, il est plus souple de se servir d'une macro que d'une fonction qui nécessite de passer l'adresse du pointeur :
Les symboles prédéfinis
Il existe des symboles prédéfinis pour le préprocesseur. On trouve par exemple __LINE__ et __FILE__ sont substitués par le numéro de ligne courante et le nom du fichier source courant :
permet d'avoir à l'exécution en plus du message d'erreur, le fichier et le numéro de ligne où s'est produite l'erreur. Les caractères spéciaux
Le caractère # appliqué à un argument l'entoure de guillemets :
affiche à l'exécution "var == 1" (#x a été remplacé par var). Le langage C dispose d'un moyen de contrôle dynamique qui permet de s'assurer qu'une condition reste toujours vérifiée à un endroit donné du programme : assert (condition)
Si indice est supérieur à limite lors de l'évaluation de l'assertion, l'exécution est interrompue et affiche un message d'erreur. Cette technique est très utile pour mettre au point un programme. Ce contrôle peut être désactivé par la définition du symbole NDEBUG. Non seulement la condition n'est plus évaluée, mais aucun code ne sera généré pour ce contrôle. Les caractères ## permettent de concaténer deux éléments pour n'en former qu'un seul, celui-ci pouvant à son tour être substitué par sa valeur s'il correspond à un symbole défini :
Objets génériques
La puissance des macros permet de définir des objets génériques. L'exemple suivant illustre la possibilité de définir un objet pile pouvant être implémenté comme une pile d'entiers, de réels, de structures ... L'objet pile comprend un type structure composé d'un pointeur vers une zone de mémorisation des éléments de la pile, et ses opérations : création d'une pile de type et de taille donnée, empilage et dépilage d'éléments et destruction de la pile. L'objet va être défini par deux macros : une macro INTERFACE qui va réaliser la définition du type structure et la déclaration des fonctions, et une macro IMPLEMENTATION qui réalisera la définition des fonctions :
Exemple d'utilisation :
![]()
|
![]() |
![]() |
![]() |
© 2000-2025 Exood4 Studio. Tous droits réservés. |