(b)?(a):(b))"."/> (b)?(a):(b))".">

Maison  >  Article  >  Fonction de définition de macro

Fonction de définition de macro

藏色散人
藏色散人original
2020-05-17 09:44:007469parcourir

Fonction de définition de macro

Lors du prétraitement, tous les "noms de macro" qui apparaissent dans le programme sont remplacés par les chaînes dans la définition de la macro. C'est ce qu'on appelle la "substitution de macro" ou la "substitution de macro" Macro Expand". . La définition de macro est complétée par la commande de définition de macro dans le programme source. La substitution de macro est effectuée automatiquement par le préprocesseur. Si la chaîne est une expression, nous l’appelons une définition de macro fonctionnelle.

Prenons comme exemple les deux lignes de code suivantes pour développer la description :

Définition de la macro fonctionnelle : #define MAX(a,b) ((a)>(b)?(a):(b))

Fonction ordinaire : MAX(a,b) { return a>b?a:b;}

(1) Les paramètres définis par les macros fonctionnelles n'ont pas de type. Le préprocesseur est uniquement responsable du remplacement formel et n'effectue pas de vérification du type de paramètre, soyez donc très prudent lors de la transmission des paramètres.

(2) Faites attention au format lors de la définition des macros fonctionnelles, notamment les parenthèses.

Si la fonction de définition de macro ci-dessus est écrite sous la forme #define MAX(a,b) (a>b?a:b) et omet les crochets intérieurs, le résultat de l'exécution sera erroné en raison de la priorité de l'opérateur après Expansion de macro ; Si la fonction de définition de macro ci-dessus omet les crochets extérieurs et que la définition de macro est ++MAX(a,b), alors l'expansion de macro devient ++(a)>(b)?(a):(b) , La priorité des opérations est également fausse.

(3) Si le paramètre de fonction est une expression, le processus de remplacement de l'appel de fonction ordinaire et de la définition de macro fonctionnelle est différent.

Lorsqu'une fonction normale est appelée, la valeur de l'expression du paramètre réelle est d'abord obtenue puis transmise au paramètre formel. Si l'expression du paramètre réelle a un effet secondaire, alors ces effets secondaires ne se produisent qu'une seule fois. Par exemple, MAX(++a, ++b), si MAX est une fonction ordinaire, a et b ne sont augmentés qu'une seule fois. Mais si la macro fonctionnelle MAX est définie, elle doit être étendue à k = ((++a)>(++b)?(++a):(++b)), et a et b ne sont pas nécessairement incrémenté une ou deux fois. Par conséquent, si le paramètre est une expression, vous devez être prudent lors du remplacement de la définition de la macro fonctionnelle.

(4) Les instructions générées par compilation de code appelant une fonction réelle et de code appelant une définition de macro fonctionnelle sont différentes.

Si MAX est une fonction ordinaire, alors son corps de fonction renvoie a > a : b; Pour compiler et générer des instructions, chaque appel qui apparaît dans le code doit également être compilé et généré pour générer le passage de paramètres. instructions et instructions d'appel. Et si MAX est une définition de macro fonctionnelle, la définition de macro elle-même n'a pas besoin d'être compilée pour générer des instructions, mais les instructions générées par compilation pour chaque appel qui apparaissent dans le code sont équivalentes à un corps de fonction, plutôt qu'à quelques paramètres. passer des instructions et appeler des instructions. Par conséquent, le fichier objet généré par la compilation à l’aide de la définition de macro fonctionnelle sera plus volumineux.

Avantages :

Tout d'abord, l'appel de fonction entraînera une surcharge supplémentaire. Il doit ouvrir un espace de pile, enregistrer l'adresse de retour, pousser les paramètres formels sur la pile et libérer le stack lors du retour de la fonction. Cette surcharge réduira l'efficacité du code, et l'utilisation de définitions de macros est meilleure que les fonctions en termes de taille et de vitesse de code

Deuxièmement, les paramètres de la fonction doivent être déclarés comme un type spécifique ; , il ne peut donc être utilisé que dans des expressions de types appropriés. Si nous voulons comparer les tailles de deux types à virgule flottante, nous devons écrire une fonction de comparaison spécifiquement pour les types à virgule flottante. Au contraire, la définition de macro ci-dessus peut être utilisée. pour les entiers, les entiers longs, les types à virgule flottante simple, les types à virgule flottante double et d'autres types dont les valeurs peuvent être comparées à l'aide de l'opérateur "<", c'est-à-dire que la macro n'a rien à voir avec le type.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn