2

我想为我的函数编写不同的实现,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

4

2 回答 2

2

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

// MyHeader.h
#if DO_INLINE
static inline int myFunc(void) { return 42; }
#else
int myFunc(void);
#endif
于 2015-02-09T16:39:12.683 回答
1

想得够仔细了。应将实现定义为“extern inline”:

// MyHeader.h
int myFunc(void);

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

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

于 2015-02-09T18:57:04.363 回答