4

最近、 Cの暗黙的な関数宣言について学びました。主なアイデアは明確ですが、この場合のリンク プロセスの理解に問題があります。

次のコード ( file ac )を検討してください。

#include <stdio.h>

int main() {
    double someValue = f();
    printf("%f\n", someValue);
    return 0;
}

コンパイルしようとすると:

gcc -c a.c -std=c99

function の暗黙の宣言に関する警告が表示されますf()

コンパイルしてリンクしようとすると:

gcc a.c -std=c99

未定義の参照エラーがあります。だからすべてが大丈夫です。

次に、別のファイル (ファイルbc )を追加します。

double f(double x) {
    return x;
}

そして、次のコマンドを呼び出します。

gcc a.c b.c -std=c99

驚くべきことに、すべてが正常にリンクされています。もちろん、 . /a.out呼び出しの後、ごみの出力が表示されます。

だから、私の質問は次のとおりです。暗黙的に宣言された関数を持つプログラムはどのようにリンクされていますか? そして、コンパイラ/リンカーのフードの下で私の例では何が起こりますか?

thisthisthis oneのような SO に関する多くのトピックを読みましたが、まだ問題があります。

4

4 に答える 4