4

私のライブラリには、内部と外部の両方で使用される関数が含まれています。関数が非常に小さいため、内部呼び出し時にコンパイラに関数のインライン化を試みさせたいと考えています。関数は不完全型の情報を使用するため、外部呼び出しはインライン化できません。したがって、私のモジュールには、外部リンケージを持つ関数のコピーも常に含まれている必要があります。

次の解決策を見つけたと思いますが、アドバイスをお願いします。

/* stack.h */
struct stack;
extern bool stack_isempty(struct stack *s);

/* stack.c */
#include "stack.h"
struct stack { [...]; int size; };
inline bool stack_isempty(struct stack *s) { return s->size == 0; }

通常、インラインを逆に使用するか、static inline関数をヘッダー ファイルに入れるだけです。しかし、説明したように、これはここでは不可能です。

このアプローチは望ましい結果をもたらしますか? このアプローチに不利な点がある人はいますか (移植可能な C99 ですか)?

4

1 に答える 1

5

これは、C99 ルールの下ではまったく問題ないように見えます。関数の宣言と宣言のstack.c両方でコンパイルされるため、外部リンケージで定義され、そのファイル内でインライン化することもできます。externinline

他のファイルには宣言のみが含まれるため、外部リンクを使用してバージョンにリンクされます。

この関数では、静的ストレージ期間を持つ変更可能なオブジェクトを定義したり、そうでない関数やグローバル変数を参照したりすることは許可されていないことに注意してくださいextern

于 2010-08-25T13:24:56.647 に答える