最近、 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呼び出しの後、ごみの出力が表示されます。
だから、私の質問は次のとおりです。暗黙的に宣言された関数を持つプログラムはどのようにリンクされていますか? そして、コンパイラ/リンカーのフードの下で私の例では何が起こりますか?