Macro c++
Résolu/Fermé
wikilili
Messages postés
197
Date d'inscription
lundi 4 avril 2011
Statut
Membre
Dernière intervention
12 février 2014
-
6 janv. 2012 à 21:34
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 6 janv. 2012 à 23:06
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 6 janv. 2012 à 23:06
A voir également:
- Macro c++
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
- Macro recorder - Télécharger - Confidentialité
- Telecharger macro nblettre.xla - Forum Bureautique
3 réponses
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
Modifié par mamiemando le 6/01/2012 à 22:50
Modifié par mamiemando le 6/01/2012 à 22:50
Une macro est une fonction définie grâce à un #define. Il s'ensuit plusieurs différences, que la fonction soit inline ou pas.
1) Au niveau de la compilation : Contrairement à une fonction, elle sera substituée à la précompilation, donc avant la compilation. Le précompilateur évalue toutes les instructions précédées d'un # (#include, #define...)). Une fois ce travail fait, la compilation a proprement parler commence.
Exemple :
Petit rappel préalable, en C écrire :
...vaut valeur_1 si condition est vraie, valeur_2 sinon.
Regardons maintenant ce que fait le précompilateur sur le code suivant :
Après précompilation :
2) Au niveau des précautions à prendre : les parenthèse autour de 'a' et 'b' dans le #define sont importantes pour gérer la manière dont on a défini y. Ok donc notre macro est proprement définie, peu importe les valeurs que je passe en paramètre. Note que les précautions que j'ai du prendre dans ma macro serait complètement inutiles dans une fonction ordinaire. C'est donc une seconde différence.
3) Au niveau de la signature et de la généricité : Voici à quoi la fonction ressemblerait par exemple
Et là on voit la troiième différence. Dans ma fonction max, je dois définir explicitement le type de x, de y, et de la valeur de retour. Ainsi si je dois avoir une fonction max qui supporte les int, les doubles etc... je dois écrire autant de fonction max.
Certains répondront en C++, on n'écrirait qu'une fonction grâce aux templates, mais en réalité le C++ compilera toutes les "versions" nécessaires de la fonction max (pour chaque type requis). Pour information on écrirait par exemple :
4) Au niveau de la mémoire : à moins que ta fonction soit "inline", appeler un appel de fonction engendre une mise en pile, ce qui n'est pas le cas pour une macro. En général on réserve l'utilisation de macro et de fonction inline à des fonctions "courtes" afin d'éviter de faire gonfler abusivement la taille du binaire.
5) Au niveau des implémentations dans les headers : En C++, quand on veut implémenter une fonction dans un header, le mot clé inline permet de s'en sortir afin d'éviter les risques de multiples définitions si le header est inclu depuis plusieurs fichiers. Même si tu prends soin de "verrouiller" tes headers comme cela :
... on ne pourrait pas gérer les définitions multiples avec des macros (et donc il faudrait soit déplacer l'implémentation dans le fichier ".c" ou ".cpp" correspondant, soit utiliser le mot clé inline).
1) Au niveau de la compilation : Contrairement à une fonction, elle sera substituée à la précompilation, donc avant la compilation. Le précompilateur évalue toutes les instructions précédées d'un # (#include, #define...)). Une fois ce travail fait, la compilation a proprement parler commence.
Exemple :
#define MAX(a,b) ((a) > (b) ? (a) : (b))
Petit rappel préalable, en C écrire :
condition ? valeur_1 : valeur_2
...vaut valeur_1 si condition est vraie, valeur_2 sinon.
Regardons maintenant ce que fait le précompilateur sur le code suivant :
int x = MAX(3, 5); bool b = true; int y = MAX(b ? 1 : 2, b ? 3 : 4);
Après précompilation :
int x = ((3) > (5) ? (3) : (5)); bool b = true; int y = ((b ? 1 : 2) > (b ? 3 : 4) ? (b ? 1 : 2) : (b ? 3 : 4));
2) Au niveau des précautions à prendre : les parenthèse autour de 'a' et 'b' dans le #define sont importantes pour gérer la manière dont on a défini y. Ok donc notre macro est proprement définie, peu importe les valeurs que je passe en paramètre. Note que les précautions que j'ai du prendre dans ma macro serait complètement inutiles dans une fonction ordinaire. C'est donc une seconde différence.
3) Au niveau de la signature et de la généricité : Voici à quoi la fonction ressemblerait par exemple
int max(int x, int y){ return x > y ? x : y; }
Et là on voit la troiième différence. Dans ma fonction max, je dois définir explicitement le type de x, de y, et de la valeur de retour. Ainsi si je dois avoir une fonction max qui supporte les int, les doubles etc... je dois écrire autant de fonction max.
Certains répondront en C++, on n'écrirait qu'une fonction grâce aux templates, mais en réalité le C++ compilera toutes les "versions" nécessaires de la fonction max (pour chaque type requis). Pour information on écrirait par exemple :
template <typename T> const T & max(const T & x, const T & y){ return x > y ? x : y; }
4) Au niveau de la mémoire : à moins que ta fonction soit "inline", appeler un appel de fonction engendre une mise en pile, ce qui n'est pas le cas pour une macro. En général on réserve l'utilisation de macro et de fonction inline à des fonctions "courtes" afin d'éviter de faire gonfler abusivement la taille du binaire.
5) Au niveau des implémentations dans les headers : En C++, quand on veut implémenter une fonction dans un header, le mot clé inline permet de s'en sortir afin d'éviter les risques de multiples définitions si le header est inclu depuis plusieurs fichiers. Même si tu prends soin de "verrouiller" tes headers comme cela :
#ifndef MON_FICHIER_HPP #define MON_FICHIER_HPP ... #endif
... on ne pourrait pas gérer les définitions multiples avec des macros (et donc il faudrait soit déplacer l'implémentation dans le fichier ".c" ou ".cpp" correspondant, soit utiliser le mot clé inline).
wikilili
Messages postés
197
Date d'inscription
lundi 4 avril 2011
Statut
Membre
Dernière intervention
12 février 2014
2
6 janv. 2012 à 22:57
6 janv. 2012 à 22:57
merciiii
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
6 janv. 2012 à 23:06
6 janv. 2012 à 23:06
De rien ;-) Bonne continuation !