2010-08-25 3 views
4

Ma bibliothèque contient une fonction utilisée à la fois interne et externe. La fonction est si petite que je veux que le compilateur essaie d'utiliser la fonction inline lorsqu'il est appelé internal. Comme la fonction utilise des informations de type incomplet, les appels externes ne peuvent pas être insérés. Donc, mon module devrait également toujours contenir une copie de la fonction avec un lien externe.Comment définir une fonction comme copie interne et externe en ligne dans C99

Je pense avoir trouvé la solution suivante, mais souhaitez que votre conseil:

/* stack.h */ 
struct stack; 
extern bool stack_isempty(struct stack *s); 

/* stack.c */ 
#include "stack.h" 
struct stack { [...]; int size; }; 
inline bool stack_isempty(struct stack *s) { return s->size == 0; } 

Habituellement j'utiliser en ligne l'inverse ou seulement mettre une fonction static inline dans le fichier d'en-tête. Mais comme expliqué, ce n'est pas possible ici.

Cette approche donne-t-elle les résultats escomptés? Quelqu'un voit-il des inconvénients à cette approche (est-ce portable C99)?

+0

Bien que cette question soit valable d'un point de vue linguistique, d'un point de vue pratique, inline n'a pas d'effet sur la capacité d'un compilateur à s'intégrer en interne, vous pouvez donc obtenir les mêmes résultats cela, ce qui simplifie votre code. – Leushenko

Répondre

5

Cela semble parfaitement bien sous les règles C99. Parce que stack.c est compilé à la fois avec une déclaration extern et inline de la fonction, il sera défini avec un lien externe et peut également être incorporé dans ce fichier.

D'autres fichiers auront seulement la déclaration, et ainsi lieront à la version avec le lien externe.

Notez que la fonction n'est pas autorisée à définir des objets modifiables ayant une durée de stockage statique ou à référencer des fonctions ou des variables globales qui ne sont pas extern.

+0

Merci. Pendant ce temps j'ai pensé à 3 problèmes possibles, mais ils sont tous absurdes: 1. L'ordre de définition et de déclaration pour les fonctions en ligne; 2. Le lien des déclarations de structure; 3. Les utilisateurs fournissant leur propre définition en ligne qui «remplace» le mien. – schot

Questions connexes