質問

私は持っています static inline hファイルで定義された関数、およびcファイルのある時点で、このような関数へのポインターを割り当てています。

foo.h:

static inline void frobnicate(void) {
    // frobs something.
}

foo.c

#include "foo.h"

void execute(void (*func)(void) ) {
    func();
}

void blahBlahBlah(void) {
    execute(frobnicate);
}

bar.c

#include "foo.h"
// ...
frobnicate();

だから私はここで起こることは、コンパイラがコールをインラインにすることだと思います frobnicate bar.cから、しかしfoo.cでは、実際に実装する関数を作成する必要があります frobnicate, 、それがそれに対する実用的なポインターを持つことができるように。

私の理解が正確であるかどうかを確認でき、そうでなければ私を修正できますか?

役に立ちましたか?

解決

inline C標準の誤称の1つです。その主な意味は、リンク時に「複数の定義」の問題に対処することなく、ヘッダーファイルに関数の定義を配置できることです。

C99とC11の公式の方法は、達成したいことをすることです inline ヘッダーファイルの定義はありません static. 。また、シンボルを放出する必要があるため、コンパイルユニットがあるはずのコンパイラに伝える必要があります。このようなインスタンス化は、aを持つことで実行できます 宣言 その.cファイルでは、省略します inline キーワード。

ほとんどの場合、シンボルが実際に必要な.cファイルを使用できます。

他のヒント

はい、あなたは正しいです。関数へのポインタを取得する場合、コンパイラは「スタンドアローン」バージョンを作成する必要があります。ここでは、コードを通常の関数として呼び出すことができます。

関数をインランス化する利点は、呼び出しコードを作成する必要がなく、他の最適化が発信者関数とインラインされた関数の両方を統合することができることです。ただし、関数を定期的に呼び出す必要がある場合(アドレスを後者と呼ぶときに)、それらの最適化はもはや不可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top