2010-07-20 36 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

相關問題