「それは何をするのか」と答えるのではなく、「どうすれば自分のやりたいようにするのか」と答えます。5種類のインライン化があり、すべてGNU C89、標準C99、およびC ++で使用できます。
アドレスが取得されない限り、常にインライン
追加 __attribute__((always_inline))
宣言にし、次のいずれかのケースを使用して、アドレスが取得される可能性を処理します。
そのセマンティクスが必要でない限り、これを使用しないでください(たとえば、特定の方法でアセンブリに影響を与えるため、または使用するため) alloca
)。コンパイラは通常、それが価値があるかどうかをあなたよりよく知っています。
インラインで弱いシンボルを出力します(C ++のように、「単に動作させる」)
__attribute__((weak))
void foo(void);
inline void foo(void) { ... }
これにより、同じコードのコピーが多数残され、リンカが任意にコピーを選択することに注意してください。
インラインですが、シンボルを放出しません(外部参照は残します)
__attribute__((gnu_inline))
extern inline void foo(void) { ... }
常に放出する(1つのTUに対して、前のものを解決するため)
ヒント付きバージョンは、C ++では弱いシンボルを放出しますが、Cのいずれかの方言では強いシンボルを放出します。
void foo(void);
inline void foo(void) { ... }
または、両方の言語で強いシンボルを発するヒントなしでそれを行うことができます:
void foo(void) { ... }
一般に、定義を提供するときにTUがどの言語であるかを知っているので、おそらくそれほどインライン化する必要はありません。
インラインで、すべてのTUで放出
static inline void foo(void) { ... }
これらを除いて、上記static
のvoid foo(void)
宣言を追加できます。これは、クリーンなヘッダーを記述#include
し、インライン定義を含む別のファイルを作成する「ベストプラクティス」に役立ちます。次に、Cスタイルのインラインを使用する場合、#define
は、1つの専用TUで異なるマクロを使用して、範囲外の定義を提供します。
extern "C"
ヘッダーがCとC ++の両方から使用される可能性がある場合は忘れないでください!