3

De mon professeur de cours, il a souligné à plusieurs reprises et nous a demandé de ne pas utiliser le mot-clé "inline" pour les fonctions. Il dit que ce n'est pas "portable" à travers les compilateurs et n'est pas "standard". Considérant ceci, existe-t-il des alternatives "standard" qui permettent une "expansion en ligne"?Alternatives au mot clé "en ligne" C

+2

Bien, est-il vraiment encore besoin * à * utiliser 'inline'? Si j'étais instructeur, c'est ce que je dirais - «optimisation». –

Répondre

18

Votre instructeur a tort. Il est standard. C'est en fait en la norme actuelle, juste là dans la section 6.7.4 Function specifiers (C99). Le fait que ce soit une suggestion au compilateur qui peut être totalement ignorée ne le rend pas moins standard.

Je ne pense pas que ce soit en C89/90 qui peut être ce que certains compilateurs embarqués utilisent mais je donnerais sérieux considération à la mise à niveau dans ce cas. Cependant, même si inline est disponible, je laisse généralement ces décisions au compilateur lui-même puisque la plupart des modernes sont plus que capables de trouver la meilleure façon d'optimiser le code (et généralement beaucoup mieux que moi). Le mot-clé inline, comme register et auto, n'est pas quelque chose dont je m'inquiète normalement.

Vous pouvez utiliser des macros à la place, car il s'agit d'une substitution de texte relativement simple qui se produit généralement avant la phase de compilation, mais vous devez être conscient des limitations et des faiblesses.

Ou vous pouvez manuellement le code en ligne (c'est-à-dire, le dupliquer) bien que je ne suggère pas cela comme une option, car il peut rapidement devenir un cauchemar de maintenance.

Moi-même, j'écrirait le code en utilisant les fonctions normales sans toute de ces tours, puis les introduire si nécessaire (et seulement si vous pouvez démontrer qu'ils sont nécessaires, comme un problème de performance spécifique).

Vous devriez toujours supposer que le codeur qui doit maintenir votre code est un tueur psychopathe qui sait où vous vivez :-)

+6

+1 La chose importante à garder à l'esprit ici est que, même si le mot clé 'inline' est standard, les compilateurs sont arrivés à un point où ils sont plus intelligents que la plupart d'entre nous la plupart du temps. Ce que votre professeur est probablement en train de faire, c'est que vous ne devriez pas essayer de prendre ces décisions vous-même, mais plutôt laisser le soin au compilateur de décider quand cela est le plus approprié. –

+0

Ouais, une partie du code que j'ai vu gcc émettre à son niveau d'optimisation "fou" m'a pris du temps à comprendre. – paxdiablo

+1

Où pouvons-nous trouver un bon lien qui explique tous ces problèmes? Im un autre étudiant – Muggen

0

Aussi démoniaques qu'elles puissent être, les macros sont toujours roi (bien que des compilateurs spécifiques puissent supporter des capacités supplémentaires).

0

Ici, il est maintenant « compilateurs à travers portables »:

#if (__STDC_VERSION__ < 199901L) 
#define inline 
#endif 
static inline int foobar(int x) /* ... */ 

En passant, comme d'autres l'ont dit, le mot-clé inline est juste un indice et plutôt inutile, mais le mot-clé important est static. A moins que votre fonction ne soit déclarée static, elle aura un lien externe, et il est peu probable que le compilateur considère qu'il est candidat à l'inlining lorsqu'il prend ses propres décisions sur les fonctions à incorporer.

Notez également que contrairement à C++, le langage C n'autorise pas inline sans static.

+0

@R .: non 'inline' sans static? Comment arrivez-vous à cette conclusion? Il est difficile d'utiliser 'inline' sans static avec des compilateurs non conformes tels que gcc pre-4.3, c'est-à-dire. Mais pour que les compilateurs conformes l'utilisent avec 'inline' dans l'entête et aient une déclaration * supplémentaire * sans 'inline' pour instater la fonction dans une seule unité de compilation, cela devrait faire l'affaire. –

+0

@Jens: Ce comportement n'est pas spécifié par le langage C. C'est une bastardisation de compilateur à partir de C++. –

+0

@R .: oui, il est explicitement spécifié lorsqu'une définition est une * définition en ligne * ou non. S'il vous plaît, lisez la norme. –

2

Comme d'autres l'ont dit, inline a été intégré à la norme C il y a 11 ans.

Autre que cela a été indiqué, inline fait une différence car elle modifie les propriétés de visibilité de la fonction. En particulier pour les grandes bibliothèques avec beaucoup de fonctions déclarées seulement static vous pourriez avoir une version de toutes ces fonctions dans tous les fichiers objet (e.g lorsque vous compilez avec le débogage activé).

S'il vous plaît jeter un oeil sur ce poste: Myth and reality about inline in C99

+0

Merci pour le lien et l'article. Très informatif –