関数のさまざまな実装を書きたいと思います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