13

Hファイルで定義されたstatic inline関数があり、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();

したがって、ここで起こることは、コンパイラがbar.cからの呼び出しをインライン化することだと思いますfrobnicateが、foo.cでは、実際に実装する関数を作成する必要があります。これにより、コンパイラへfrobnicateのポインタが機能します。

誰かが私の理解が正しいかどうかを確認し、そうでない場合は訂正できますか?

4

2 に答える 2

11

inlineC規格の誤称の1つです。その主な意味は、リンク時に「複数定義」の問題に対処することなく、関数の定義をヘッダーファイルに入れることができることです。

C99およびC11で達成したいことを実行する公式の方法はinline、ヘッダーファイルに。を付けずに定義を含めることですstatic。シンボルも発行する必要があるため、これをどのコンパイル単位にするかをコンパイラーに指示する必要があります。このようなインスタンス化は、キーワードを省略した.cファイルに宣言を含めることで実行できます。inline

最も当然のことながら、実際にシンボルが必要な場所で.cファイルを使用できます。

于 2012-01-16T20:17:54.053 に答える
9

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

関数をインライン化する利点は、呼び出し元のコードを作成する必要がなく、呼び出し元の関数とインライン化された関数の両方を統合するために他の最適化を適用できることです。ただし、関数を定期的に呼び出す必要がある場合(アドレスを取得して後で呼び出す場合など)、これらの最適化は不可能になります。

于 2012-01-16T20:17:12.087 に答える