将函数声明为非静态并实现为静态内联
Declare function as non-static and implement as static inline
我想为我的函数编写不同的实现,有些 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
这个 header.h 应该有效:
// MyHeader.h
#if DO_INLINE
static inline int myFunc(void) { return 42; }
#else
int myFunc(void);
#endif
仔细想想。实施应定义为 "extern inline" 而不是:
// MyHeader.h
int myFunc(void);
#if DO_INLINE
extern inline int myFunc(void) { return 42; }
#endif
编译器会在它认为合适的地方内联此函数,但仍将其作为函数编译一次,以使其可用于链接。那部分我不需要,但它并没有真正伤害。
我想为我的函数编写不同的实现,有些 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
这个 header.h 应该有效:
// MyHeader.h
#if DO_INLINE
static inline int myFunc(void) { return 42; }
#else
int myFunc(void);
#endif
仔细想想。实施应定义为 "extern inline" 而不是:
// MyHeader.h
int myFunc(void);
#if DO_INLINE
extern inline int myFunc(void) { return 42; }
#endif
编译器会在它认为合适的地方内联此函数,但仍将其作为函数编译一次,以使其可用于链接。那部分我不需要,但它并没有真正伤害。