2010-07-20 35 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; 
} 

如何实现在function.cf()一个定义,就像在gnu89但使用C99模式?

回答

2

你把内联定义的头文件,而不extern,并在源文件中添加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; 
} 

在C.

http://www.greenend.org.uk/rjk/2003/03/inline.html更多有关inline如果你真的要保留所有的定义(在线与否)在function.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 

ñ没有经过严格测试,不推荐。

+0

对不起,如果我不清楚,我希望函数定义在源文件中,以保持逻辑只在一个文件中,无论函数是否被内联。 – lxndr 2010-07-22 08:35:49

+0

我不认为这是可能的。为了使内联可行,翻译单元需要知道函数定义,所以它必须在头文件中。 也许你可以用一些奇怪的条件包含来做到这一点,我会尝试添加到我的答案。 – schot 2010-07-22 09:21:07

+0

那么,直接在头文件中写入定义可能会更具可读性。这是否意味着extern inline在C99中没有意义? – lxndr 2010-07-22 11:37:45

相关问题