将函数声明为非静态函数并实现为静态内联函数

时间:2015-02-09 16:29:35

标签: c gcc static inline-functions

我想为我的函数编写不同的实现,有些是inline,有些则没有。因此,我想将函数声明为:

// MyHeader.h
int myFunc(void);

#if DO_INLINE
static inline int myFunc(void) { return 42; }
#endif

然后还有:

// MySource.c
#if !DO_INLINE
#include "myHeader.h"
int myFunc(void) { return 42; }
#endif

我将在编译时指定DO_INLINE

MSVC对此没有任何问题,但是GCC(4.1.1)抱怨说我已经宣布它是非静态的,我正在声明一个静态函数。如果我从多个编译单元中删除static限定符和#include "MyHeader.h",它将会抱怨多个定义。 (好像inline函数是extern。)我不太明白为什么编译器有这个问题。

我认为这应该是非常明显和明确的:

int myFunc(void);
static inline int myFunc(void) { return 42; }

不应要求声明为static

那就是说,我的问题有一个解决方案,我正在努力避免:

#if DO_INLINE
#define MAYBE_STATIC static
#else
#define MAYBE_STATIC 
#endif

MAYBE_STATIC int myFunc(void);

编辑:这是一个更现实的用例:http://codepad.org/OkC0Su3v

2 个答案:

答案 0 :(得分:2)

这个header.h应该可以工作:

// MyHeader.h
#if DO_INLINE
static inline int myFunc(void) { return 42; }
#else
int myFunc(void);
#endif

答案 1 :(得分:1)

足够仔细地计算出来。应该将实现定义为“extern inline”:

// MyHeader.h
int myFunc(void);

#if DO_INLINE
extern inline int myFunc(void) { return 42; }
#endif

编译器会将此函数内联到它认为合适的位置,但仍然将其作为函数编译一次,以使其可用于链接。那部分我不需要,但它并没有真正受到伤害。