Fonctions macro et fonctions statiques dans l'en-tête

9

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.

wirrbel
la source
l'écriture d'une macro appropriée est pénible, et inlineles 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'espace
ratchet freak
2
Je soupçonne en fait que la plupart de ces raisons sont historiques. Il y a un certain temps, les compilateurs C n'incluaient pas du tout les fonctions. Donc, les gens ont utilisé des macros pour les choses qu'ils voulaient en ligne. Le code C a généralement une durée de vie inhabituelle.
Jan Hudec
@ratchetfreak: C n'a pas inline, il ne s'agit pas de C ++.
wirrbel
2
@wirrbel Bien sûr, il y a inlineen C, au moins depuis C99. Pour un aperçu rapide, voir Wikipedia sur les fonctions en ligne .
amon

Réponses:

6

Les macros qui peuvent être résolues par un appel de fonction présentent de nombreux pièges:

  • Ils sont difficiles à écrire, car vous devrez peut-être gérer correctement des arguments comme ++i.
  • Ils sont difficiles à déboguer avec un débogueur visuel car vous ne pouvez pas parcourir une macro ou y placer un point d'arrêt.
  • Ils sont difficiles à gérer correctement lors de l'analyse des dépendances des compilations.

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.

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.

Il n'y a aucune raison pour qu'un compilateur ne soit pas en mesure de fournir deux versions d'une fonction, une traditionnelle called et une inlined. 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.)

user40989
la source