0

( )static inline内に関数が見つかりました。Bionic libcstdlib.h

を含めずにファイルをコンパイルしたいstdlib.h

例: テストファイル:

extern int test(void)
void foo() {
    int a = test();
}

int main() {
    foo ();
    return 0;
}

として定義された関数を使用するためにヘッダー ファイルを含める必要があるのはなぜstatic inlineですか?

4

3 に答える 3

1

GNUコンパイラの使用から:

関数がインラインと静的の両方である場合、関数へのすべての呼び出しが呼び出し元に統合され、関数のアドレスが使用されない場合、関数自体のアセンブラー コードが参照されることはありません。この場合、オプション -fkeep-inline-functions を指定しない限り、GCC は実際には関数のアセンブラー コードを出力しません。一部の呼び出しは、さまざまな理由で統合できません (特に、関数の定義に先行する呼び出しは統合できず、定義内の再帰呼び出しも統合できません)。統合されていない呼び出しがある場合、関数は通常どおりアセンブラー コードにコンパイルされます。プログラムがそのアドレスを参照する場合、インライン化できないため、関数も通常どおりコンパイルする必要があります。

したがって、stdlib.h をインクルードしない場合test()、実際にはそのような関数がないため、リンカがシンボルに対してリンクするために使用できるコードはありません。ただし、そうtest()でない場合でもプログラムはコンパイルおよび実行さinlineれますが、常に適切なヘッダー ファイルを含める必要があります。これにより、コンパイラは戻り値とパラメーターの型をチェックできるようになります。

于 2013-07-17T11:18:05.097 に答える
0
extern int test(void);
void foo() {
    int a = test();
}

int main() {
    foo ();
    return 0;
}

extern は外部変数です 関数ブロックの外側で定義された変数です。したがって、コンパイラはこの関数を見つけます。このファイルをインクルードしないと、コンパイラはそれを見つけることができません。

于 2013-07-17T10:46:33.090 に答える
0

この質問には受け入れられた回答がありますが、問題についてさらに洞察を加え、いくつかの疑問を解消したいと思います:-

c99 標準に準拠 (§6.2.2 #3)

オブジェクトまたは関数のファイル スコープ識別子の宣言にstaticストレージ クラス指定子が含まれている場合、識別子には内部リンケージがあります。

内部リンケージを持つ関数は、1 つの翻訳単位内でのみ表示されます。リンカーは、内部リンケージを持つこれらの関数について決して聞いていないため、それらについて何も知りません。つまり、内部リンケージを持つ関数または変数は、リンカーには見えません。ここまでで、ヘッダー ファイルを含める必要がある理由を理解したはずです。

c標準ドキュメントを確認することを忘れないでください。

于 2013-07-17T11:51:15.393 に答える