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 に答える