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
Bonjour,
s'il vous plez c'est quoi un macro? autrement dit quand faut il utiliser un macro quelles sont leurs avantage et incovenients quelle est la difference entre les macros et les fonction en ligne??


A voir également:

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
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 :

#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).
7
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
merciiii
1
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
De rien ;-) Bonne continuation !
1