2010-07-20 6 views
0

С gnu89:Как реализовать и поделиться встроенной функцией с помощью 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; 
} 

Как реализовать одно определение f() в function.c как в gnu89, но с использованием режима C99?

ответ

2

Вы кладете определение INLINE заголовочный файл без extern и добавьте Экстерн объявление/прототип в исходном файле:

/* 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; 
} 

Смотрите http://www.greenend.org.uk/rjk/2003/03/inline.html для получения дополнительной информации о inline в С.

Если вы действительно хотите сохранить все свои определения (встроенные или нет) в функции.c, как вы говорите:

/* 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 сильно тестировался и не рекомендуется.

+0

Извините, если я не был чист, я хочу, чтобы определение функции находилось в исходном файле, чтобы сохранить логику только в одном файле, независимо от того, должны ли они быть встроены или нет. – lxndr

+0

Я не думаю, что это возможно. Чтобы сделать вложение возможным, единица перевода должна знать определение функции, поэтому она должна быть в файле заголовка. Возможно, вы могли бы сделать это, используя какое-то странное условное включение, я постараюсь добавить это к моему ответу. – schot

+0

Ну, может быть более читаемым, чтобы написать определение непосредственно в заголовочном файле. Означает ли это, что extern inline не имеет смысла в C99? – lxndr

 Смежные вопросы

  • Нет связанных вопросов^_^