こんにちは
c言語で、#includeとリンクの違いはなんでしょうか。
両方同じに思えます。
両方とも、様々な部品(ファイル)を合体させるものではないでしょうか・・・??
もし宜しければ回答お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
合体という言葉を使うならば、
ソースコードレベルで合体させるのと、オブジェクトコードレベルで合体させるのとの違いです。
投稿2015/10/14 16:58
総合スコア85960
0
ベストアンサー
宣言などをコピペするのが面倒だから使うのがinclude、
実行ファイルを作るために必要なのがリンクです。
関数void Hoge(void)
があったとします。
c
1//Hoge.c 2void Hoge(void); 3void Hoge(void){ 4 //Do something. 5}
これを別のソースで使いたいとします。
C
1//UseHoge.c 2void UseHoge(void); 3void UseHoge(void){ 4 Hoge(); 5}
このままだとUseHoge.c
はコンパイルできません。(開発環境によっては通っちゃいますが。)
なぜならvoid Hoge(void)
の宣言がないからです。
なので宣言をベタ書きで追加しておきます。
C
1//UseHoge.c 2void Hoge(void); 3 4void UseHoge(void); 5void UseHoge(void){ 6 Hoge(); 7}
これでUseHoge.c
のコンパイルが通ります。
しかしベタ書きだと、また別のソースファイルで使いたかったり、
関数の数が多い時に一つ一つベタ書きしなければならないので面倒です。
タイプミスも心配です。
そこでなんか適当なファイルに宣言を書いておいて、そこからコピペすることにしましょう。
C
1//Hoge.h 2void Hoge(void);
これで多少楽になりました。
しかしまだ一々コピペするのは面倒です。
includeはこのための機能です。
#include "Hoge.h"
と書けば、Hoge.h
の中身を展開、ざっくり言えば文字列的にコピペされているものとしてコンパイルします。
さて、コンパイルで生成されたオブジェクトファイルには
「void Hoge(void)
の宣言はあるが、定義がないもの」が出てきます。
実行するにはvoid Hoge(void)
の定義されているオブジェクトファイルを含めて、
1つの実行ファイルなどにまとめる必要があります。
これがリンカの役割です。
(なので、宣言がないものを使おうとするとコンパイラに怒られ、宣言だけあって定義がどこにもない場合はリンカに怒られます。)
投稿2015/10/15 02:22
総合スコア13553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
includeは読んで字の如く、そのソースコード内に含めてしまうということです。
コンパイルした後のオブジェクトファイルには、自分が書いたソースコードと、includeで指定したヘッダーファイルの内容がすべて含まれます。
リンクの場合は、リンク先の内容がオブジェクトファイルに含まれることはありません。
合体というならば、こちらの方がよりそれっぽいでしょう。
オブジェクトファイルとライブラリファイルが合体し、1つの実行ファイルになります。
ちなみにリンクには、ダイナミックリンクとスタティックリンクがあります。
スタティックリンクの場合は、ビルド(コンパイル+リンク)時に合体しますが、ダイナミックリンクの場合は共有ライブラリ(.dll、.soなど)と実行時に合体します。
投稿2015/10/15 00:37
編集2015/10/15 00:39総合スコア1040
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/17 00:37
0
include はテキストファイルレベルの話です。
link は バイナリーファイルレベルの話です。
... 両方とも、様々な部品(ファイル)を合体させるもの...
この捉え方は適切ではありません。
次のように考えると良いかもしれません。
include
==> ソースファイルの中に 他のソールファイルを 取り込む事 を指示する記述です。
英語の include の意味 (含める) そのものです。
link
==> オブジェクトから実行ファイルを作成することです。
そのオブジェクトに中で定義されていない照関数や定数をつかっている(参照している)ことがあります。
プログラムとして実行するときは、それらの参照先が実際に存在していないと動作しません。
link とは、この参照先を解決するようにする作業です。
つまり参照(呼び出し) 元と定義を link (結びつける) させているのです。
必ずしも合体させているわけではありません。
(全部を1つにまとめてしまって 結びつきを解消させる場合もあるし、参照先を他のファイルやメモリー中の位置として解消させる場合もあります)
参考:
-
#include ディレクティブ https://msdn.microsoft.com/ja-jp/library/36k2cdd4(v=vs.120).aspx
...
指定されたファイルの内容をソース プログラムに読み込むように、このディレクティブが出現した時点でプリプロセッサに指示します。
... -
コンパイルとリンク方法 http://keicode.com/winprimer/wp02.php
...
ビルドは、コンパイルとリンクを実行し、実行可能ファイルを作成する処理のことです。
コンパイルでは、ソースファイル (.cpp や .h) からオブジェクトファイル (.obj) を生成します。
リンクでは、オブジェクトファイル (.obj) やライブラリファイル (*.lib) から実行可能ファイルを作成します。
...
投稿2015/10/15 14:57
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/17 00:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/14 22:46
2015/10/15 00:51