pour beaucoup de tâches rapides où l'on pourrait utiliser une fonction f(x,y)
, en simple C, des macros sont utilisées. Je voudrais poser des questions spécifiques sur ces cas, qui peuvent être résolus par un appel de fonction (c'est-à-dire les macros utilisées pour les fonctions en ligne, pas pour l'expansion de code de code arbitraire).
En règle générale, les fonctions C ne sont pas intégrées car elles peuvent être liées à d'autres fichiers C. Cependant, les fonctions C statiques ne sont visibles qu'à partir du fichier C dans lequel elles sont définies. Par conséquent, elles peuvent être intégrées par les compilateurs. J'ai entendu dire que beaucoup de macros devraient être remplacées en les transformant en fonctions statiques, car cela produit un code plus sûr.
Y a-t-il des cas où ce n'est pas une bonne idée?
Encore une fois: ne pas poser de questions sur les macros de production de code avec des constructions ## semblables qui ne peuvent pas du tout être exprimées en tant que fonction.
inline
les fonctions ing garantissent qu'elle peut être définie plusieurs fois dans le binaire, le compilateur peut décider si elle l'inclura réellement pour peut-être économiser de l'espaceinline
, il ne s'agit pas de C ++.inline
en C, au moins depuis C99. Pour un aperçu rapide, voir Wikipedia sur les fonctions en ligne .Réponses:
Les macros qui peuvent être résolues par un appel de fonction présentent de nombreux pièges:
++i
.Les macros qui peuvent être résolues par un appel de fonction auraient pu être utiles pour fournir un alignement dans un compilateur primitif. Je ne suis au courant d'aucun compilateur ne gérant pas les fonctions en ligne et certains peuvent même être en ligne sur plusieurs unités de compilation.
Il n'y a aucune raison pour qu'un compilateur ne soit pas en mesure de fournir deux versions d'une fonction, une traditionnelle
call
ed et uneinline
d. Vous devriez regarder la documentation du compilateur que vous ciblez. En outre, vous voudrez peut-être regarder l'assembly généré: même si vous ne connaissez pas l'assembly, vous pouvez rapidement apprendre à dire si une fonction a été intégrée ou non. (Commencez par des exemples de bébé pour apprendre rapidement cela.)la source