その図は正しいです。
ヘッダーを#include
作成すると、基本的にそのヘッダーがファイルにコピーされます。ヘッダーは、型、関数宣言、定数などのリストですが、実際のコードは含まれていません (C++ およびインライン関数にもかかわらず)。
例を見てみましょう: library.h
int foo(int num);
library.c
int foo(int num)
{
return num * 2;
}
yourcode.c
#include <stdio.h>
#include "library.h"
int main(void)
{
printf("%d\n", foo(100));
return 0;
}
#include
library.hを実行すると、 の宣言が得られますfoo()
。この時点で、コンパイラは foo() やそれが何をするかについて他に何も知りません。foo()
これにもかかわらず、コンパイラは呼び出しを自由に挿入できます。リンカは、foo()
youcode.cでへの呼び出しを見て、 library.cでコードを見て、へのすべての呼び出しがfoo()
そのコードに行くべきであることを知っています。
言い換えると、コンパイラは呼び出す関数をリンカに指示し、リンカは (すべてのオブジェクト コードを与えられて) その関数が実際にどこにあるかを認識します。
(修正のための Fiddleling Bits に感謝します。)