Dupliquer possible:
Fonctions en ligne vs macros de préprocesseur
Je veux connaître la différence entre la fonction inline et la fonction macro.
1) la fonction en ligne est-elle la même chose que la fonction macro?
2) Je sais que les deux ne sont pas appelés mais ils sont remplacés par leur code dans la phase de compilation n'est pas?
3) S'il y a une différence, pouvez-vous la spécifier?
Inline remplace un appel à une fonction par le corps de la fonction. Toutefois, inline n’est qu’un request au compilateur qui pourrait être ignoré (vous pouvez toujours passer des indicateurs au compilateur pour forcer inline ou utiliser always_inline attribut avec gcc).
Une macro, par contre, est développée par le préprocesseur avant la compilation. C'est donc comme pour la substitution de texte, les macros ne sont pas vérifiées, les fonctions inline le sont également. Il y a une comparaison dans le wiki .
Par souci d'exhaustivité, vous pouvez toujours avoir une sorte de sécurité de type avec les macros, en utilisant par exemple le __typeof__
de gcc, ce qui suit génère un code presque identique et les deux provoquent des avertissements s'ils sont utilisés avec les mauvais types:
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
__attribute__((always_inline)) int max(int a, int b) {
return (a > b ? a : b);
}
Remarque: il est parfois nécessaire d'utiliser des macros sans type. Par exemple, voyez comment uthash utilise les macros pour rendre toute structure C hachurable sans recourir à des conversions.
1) Non.
2) Une macro en C est simplement un texte développé avant le compilateur traite le code source. Le mot-clé inline indique au compilateur que la fonction peut être placée en ligne sans qu'il soit nécessaire de configurer une pile d'appels.
Ainsi, par exemple, supposons que vous ayez les deux extraits de code suivants (d'abord la macro et ensuite la fonction inline):
#define MAX(x,y) (x > y ? x : y)
et
inline int max(int x, int y) { return x > y ? x : y; }
Lorsque le préprocesseur trouve l'appel suivant dans votre code:
int highest = MAX (var_1, var_2);
il le remplace par
int highest = (var_1 > var_2 ? var_1 : var_2);
Ce qui précède est ce que le compilateur obtient finalement au cours du processus de compilation. Par conséquent, le fragment défini par MAX (x, y) est le replacement pour MAX (var_1, var_2). Quand le compilateur trouve l'appel de fonction
int highest = max (var_1, var_2);
Ensuite, la fonction "max" est appelée. Vous devez supposer qu'il est appelé de manière normale, car le compilateur est libre d'ignorer votre indicateur "inline" et de faire en sorte que les appels à la fonction passent par la pile d'appels normale plutôt que de simplement placer le code de la fonction à sa place. rencontré.
Une dernière mise en garde avec les macros: il s’agit de remplacer tout le texte et non le code, si vous faites quelque chose comme ceci:
int highest = MAX (v1++, v2++);
le préprocesseur étendra cela à:
int highest = (v1++ > v2++ ? v1++ : v2++);
ce qui n'est probablement pas ce que vous vouliez.
Les macros sont des déclarations remplacées par le préprocesseur (avant le compile actuel). Elles ne sont pas du tout des fonctions. Avant le début de la phase compile, les macros ont disparu et il ne reste que leurs extensions (y compris les extensions à rien).
Les fonctions inline sont en fait functions conformes au langage, avec des règles de portée, des déclarations de variable, des constructions logiques (boucles, etc.), etc. Une fonction en ligne n'est pas développée comme une macro avant la compilation. Ils sont compilés tout comme le code standard, mais peuvent ensuite être injectés (faute d’un meilleur terme) dans du code compilé et optimisés au besoin.
Non inline
n'est pas la même chose que macro
definition, car la macro est prétraite mais inline est simplement l'indication au compilateur de placer le corps entier de la fonction où elle est appelée.
mettre un mot-clé inline avant toute définition de fonction est juste une indication ou une demande, le compilateur est libre de choisir s'il veut rendre cette fonction en ligne ou la laisser comme d'habitude
substitution de macros: preprocessing phase
(c'est-à-dire avant la compilation)
- fichier d'entrée test.c
fichier de résultat sous linux test.i
substitution en ligne: compilation phase