2017-07-08 5 views
3

Je vois cet exemple où j'ai un fichier crc32.c qui contient:Est-il pertinent d'avoir une seule fonction en ligne seule dans un fichier C?

inline int32_t crc32_compute(int32_t *buffer, size_t size) { 
    ... 
} 

Dans le fichier d'en-tête, je trouve:

extern inline int32_t crc32_compute(int32_t *buffer, size_t size); 

Pour moi, le mot-clé inline n'a pas d'effet parce que la fonction devrait être déclaré sur le fichier d'en-tête pas sur le fichier C. Est-ce correct?

+0

@dasblinkenlight ajouté à ma réponse – nowox

Répondre

6

Vous avez raison, celui qui a écrit ce code a mis les choses dans le mauvais sens. Le fichier d'en-tête doit contenir la fonction inline, ainsi que sa définition complète, alors que le fichier .c doit contenir extern inline déclaration, sans une définition:

tête:

inline int32_t crc32_compute(int32_t *buffer, size_t size) { 
    ... 
} 

fichier C:

extern inline int32_t crc32_compute(int32_t *buffer, size_t size); 

L'en-tête permettra au code de la fonction d'être en ligne; le fichier .c demandera au compilateur d'émettre un symbole visible à l'extérieur pour lui.

1

Ils ont oublié un mot magique statique. Maintenant, s'il est compilé par gcc, il sera ignoré et le compilateur décidera si et comment implémenter cette fonction. Quoi qu'il en soit, même s'il n'y a pas de mot-clé inline, le compilateur (et l'éditeur de liens si l'optimisation du temps de liaison est activé) décide comment implémenter l'invocation de la fonction - par inline ou appel traditionnel.

Si vous voulez vous assurer que la fonction sera inline ou non - vous devez utiliser les attributs de compilation ou les pragmas appropriés. Où placer et comment déclarer des fonctions en ligne dépend du compilateur, de l'optimisation, de l'optimisation du temps de liaison et d'autres facteurs. Répondre à votre question, si la fonction doit être visible uniquement dans la portée du fichier .c particulier - oui, il est - mais sans le mot-clé statique, il sera également placé dans le fichier objet.

+0

L'instruction 'static' nécessite que la fonction soit utilisée uniquement sur le fichier' crc32.c', mais ce fichier est destiné à être utilisé de manière externe, donc il ne sera jamais inséré, juste, parce que l'inlining est fait par le compilateur pas l'éditeur de liens. Correct? – nowox

+1

Oui et non en même temps. C'est beaucoup plus compliqué de nos jours. Les lieurs modernes peuvent aussi faire l'optimisation du temps de lien (ce n'est plus le domaine des compilateurs). Il n'y a pas de réponse simple à cette question. Vous devez vous référer à la documentation de votre compilateur/éditeur de liens. pour gcc https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Inline.html#Inline –

+0

pourriez-vous fournir un exemple de travail à cela? Le lien que vous avez donné ne montre pas que l'inline est fait pendant la phase de liaison. – nowox