2010-07-20 13 views
0

Avec gnu89:Comment implémenter et partager une fonction inline en utilisant C99?

/* share.h */ 
extern inline void f (void); 
/* function.c */ 
void f (void) {} 
/* main.c */ 
#include "share.h" 
int main (int argc, char **argv) { 
    f(); 
    return 0; 
} 

C99:

/* share.h */ 
static inline void f (void) {} 
/* main.c */ 
#include "share.h" 
int main (int argc, char **argv) { 
    f(); 
    return 0; 
} 

Comment mettre en œuvre une définition de f() dans function.c comme dans gnu89 mais en utilisant le mode C99?

Répondre

2

vous mettez la définition en ligne le fichier d'en-tête sans extern et ajouter une déclaration/prototype extern dans un fichier source:

/* share.h */ 
inline void f(void) {} 

/* function.c */ 
#include "share.h" 
extern void f(void); 

/* main.c */ 
#include "share.h" 
int main(int argc, char *argv[]) 
{ 
    f(); 
    return 0; 
} 

Voir http://www.greenend.org.uk/rjk/2003/03/inline.html pour plus d'informations sur inline en C.

Si vous avez vraiment vous voulez conserver toutes vos définitions (inline ou non) dans function.c comme vous le dites:

/* share.h */ 
#define WANT_INLINE 1 
#include "function.c" 

/* function.c */ 
#ifdef WANT_INLINE 
inline void f(void) {} 
#else 
#include "share.h" 
extern void f(void); 
#endif 

N ot fortement testé et non recommandé.

+0

Désolé si je n'étais pas clair, je veux que la définition de la fonction d'être dans le fichier source pour maintenir la logique dans un seul fichier, si les fonctions doivent être inline ou non. – lxndr

+0

Je ne pense pas que ce soit possible. Pour rendre l'inlining possible, une unité de traduction doit connaître la définition de la fonction, elle doit donc figurer dans le fichier d'en-tête. Peut-être que vous pourriez le faire en utilisant une inclusion conditionnelle bizarre, je vais essayer de l'ajouter à ma réponse. – schot

+0

Eh bien, il pourrait être plus facile à lire pour écrire la définition directement dans le fichier d'en-tête alors. Est-ce que cela signifie que extern inline n'a aucun sens dans C99? – lxndr