Fonction comme les Macros en C
Je suis en train d'essayer de comprendre l'idée de fonction comme les Macros cependant, il existe quelques points qui rampant moi. Par exemple, disons que nous avons:
#define Max(a,b) ((a)>(b)) ? (a):(b))
et je l'appelle comme tels
int i = Max(4,5);
Cela permettra d'évaluer une expression conditionnelle équivalent à a>b
? Si oui, alors a, d'autre b. Mais je suis confus quant à la façon dont la fonction Max sait quoi faire avec les arguments. À la différence d'une fonction réelle, la mise en œuvre n'est pas écrit dans le code, dans le programme appelant. la déclaration du droit de l'instruction define faire cela pour moi? Ses juste une chose nouvelle pour moi et je veux m'assurer de comprendre ce qui se passe ici.
Cette partie particulière de la fonction comme les macros me confond. Je sais que ces types de macros sont utiles pour réduire les frais généraux, car ils excluent la JSR RTS instructions du processeur qui économise de la mémoire sur la pile.
Ceci peut aider.
Vous rendez-vous compte que le '?' est un opérateur conditionnel ternaire?
Je suis pas familier avec ternaire des opérateurs conditionnels, mais ma confusion était plus à la façon dont la macro met en œuvre dans l'ensemble du programme. @OliCharlesworth je suis conscient que ce n'est pas une fonction, mais se comporte de la fonction.
Ok, alors je ne suis pas sûr exactement ce que votre question se pose au sujet!
OriginalL'auteur PresidentRFresh | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
est une macro, qui provoque rien d'autre qu'un simple textuelle de remplacement au sein de votre code, ce qui signifie que lors du prétraitement cette ligne:
est changé en:
Noter qu'il n'existe pas de type de sécurité tout en travaillant avec des macros comme celui-ci et vous aurez vraiment du mal lors du débogage de code. Une bonne règle de base est: Ne pas utiliser de macro lorsque vous pouvez obtenir le même avec la fonction:
En fait, je pense que cet exemple particulier impliquant
max()
est un grand moment pour utiliser une macro au lieu d'une fonction. En C, où il n'y a pas de modèles ou de génériques, vous devriez écrire un distinctmax()
fonction pour chaque type, alors qu'avec une macro simple tout Fonctionne (pour les types où>
est significative).Tout peut être "transmis" à cette macro. Le problème est que, parfois, il peut conduire à un comportement buggé (macros utilisées d'une manière qu'ils n'étaient pas destinés à être utilisés). Par exemple, quelqu'un pourrait passer des pointeurs qui serait la compilation de pouvoir, mais de produire de mauvais résultats.
Je suis d'accord que les macros peuvent être parfois très utile, mais il y a quand même un risque, un programmeur de leur utilisation va faire une erreur (peut-être juste une bête faute de frappe) et ce genre d'erreur est assez difficile à trouver.
Vous pouvez utiliser le
inline
mot-clé afin de le rendre plus comme une macro, mais avec le type de sécurité.OriginalL'auteur LihO
Ce que le compilateur ne voit en fait, après prétraitement, est:
Les paramètres passés à la macro sont remplacées dans le corps de la macro.
OriginalL'auteur Graham Borland
Juste arrêter de penser à propos de macro comme code compilable. Les Macros sont "résolus" par le pré-processeur, pas fait pendant la phase de compilation. Par définitions de macro que vous venez de définir comment le processus de certaine chaîne de caractères dans un fichier texte. Seule sortie de pré-processeur est passé à compilateur. Vous pouvez utiliser
gcc -E
pour voir votre source après le pré-processeur. C'est toujours un code C sur cette scène, mais sans aucune directive de préprocesseur.Espère que cela va vous aider.
OriginalL'auteur Roman Nikitchenko
d'essayer de construire votre code avec le
gcc -E
et de voir comment votre code avant de le compilerEn fait dans le processus de compilation le compilateur transformer votre code à un code preprocessor.
Dans le préprocesseur phase, le compilateur de remplacer tous les macro dans votre code c avec son contenu et générer un autre code appelé code preprocessor et puis le compilateor générer le code objet du code preprocessor
La
gcc -E
vous permettent de voir votre code preprocessorVous êtes les bienvenus
OriginalL'auteur MOHAMED