質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1724閲覧

C言語についての疑問について。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2021/04/22 11:17

以下の画像のURLで特にインポートライブラリからMessage Box ()を呼び出すための情報を抽出するのが分かりません。ご教授いただけないでしょうか?すみません。
https://6900.teacup.com/cgu135/bbs/1067

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/04/22 11:19

ちょっとは説明しようよ。
guest

回答2

0

zasx1093さんのご質問は、C言語についてではなく、Windows OSとリンカに関するものです。

ご覧になっている[1067] 無題は、書籍の一部を無断掲載したページですので、お勧めしません。
書籍全体を読めば分かることなのかもしれませんが、一部をつまみ食いして理解できるような話ではありません。ちゃんとした本を読みましょう。

詳しいことを知りたいならOSの勉強をした上で、DLL とはのようなものを読むことをお勧めします。

ご質問が「なぜ静的リンクや動的リンクを行うのか」であれば、
自分では全部を書けないから、というのが答えです。
また、必要のないものをなるべく減らして、OSが使うメモリを減らしたいとかいろいろな理由があります。

例えばzasx1093さんがmain.cの中で
printf("Hello World!!\n")
と書いたときに、zasx1093さんはprintfという名前とそれが何をしてくれるかを知っているだけですね。
実際には誰かがprintfという関数を作ってそれを提供してくれているのです。

ご質問が、「どうやって抽出するのか」であれば、以下のような方法です。

zasx1093さんがmain.cをコンパイルしたとき、Cコンパイラ本体がやることは、main.objを作って、リンカを呼び出すだけです。このとき、たくさんのオブジェクトファイルをまとめたライブラリがあり、その中からprintfという関数がどのオブジェクトに入っているかはリンカがライブラリの中にある一覧表を調べて決めています。こういうのを静的ライブラリとよび、関数本体と一覧表が一つのファイルに入っています。

MessageBoxの場合は、誰かが作った動的リンクライブラリの中にその関数が入っています。
それを呼び出すための一覧表が入っているのがインポートライブラリです。つまり、関数本体の入っている入れ物と一覧表の入っている入れ物が別々なのです。

抽出方法は、一覧表を見て、何をリンクすれば良いかなという処理を行っているだけです。

投稿2021/04/22 23:43

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/25 04:05

つまり、静的ライブラリは、関数本体と一覧表が、一つのファイルにまとまって入っているが、動的リンクライブラリは、その関数が入っており、それを呼び出すための一覧表が入っているのが、インポートライブラリという事で、別々という事でよろしいでしょうか?ご教授いただけないでしょうか?すみません。
ppaul

2021/04/27 02:20

一覧表についてはその通りです。 静的ライブラリには多くのオブジェクトファイルが入っていてそれぞれのオブジェクトファイルには複数の関数や外部変数などが入っていると考えてください。そして、特定の関数や外部変数が必要とされたときに、その関数や外部変数がその静的ライブラリ内のどのオブジェクトファイルに入っているかという情報が入っています。リンカは、関数や外部変数の参照があったときに、必要なオブジェクトだけを選んでリンクします。 動的リンクライブラリには、複数の関数や外部変数などが入っています。インポートライブラリには、どの動的リンクライブラリにその関数や外部変数が入っているかという情報が入っています。リンカは、関数や外部変数の参照があったときに、実行ファイルの起動時に必要な動的リンクライブラリをメモリ上にロードするようなコードを実行ファイルに追加します。
guest

0

自身はありませんが、回答してみます。

Sample1.cは、例えば、以下のように記載されていると思います。

c

1int main() 2 3//...省略(プログラマが記述した部分) 4MessageBox(); 5 6//...省略(プログラマが記述した部分) 7return 0; 8

しかし、Sample1.cには、MessageBox()の処理は書かれていないと思います。
そのため、どこかMessageBox()の処理がかかれた場所が必要です。
それが、インポートライブラリimport32.libになると思います。

MessageBox()の処理は、import32.libにかかれており、Smaple1.cを
完成させるためには、import32.libの情報が必要になります。

それが、
Message Box ()を呼び出すための情報
になると思います。

情報とは、import32.libにMessageBox()が含まれていること等に、なると思います。

最初は、MessageBox()のためには、import32.libが必要らしいと思っていればよいと思います。

投稿2021/04/22 15:22

編集2021/04/25 07:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/22 19:17

すみません。Sample.1.c のプログラムで、省略されているものは何でしょうか?後、このプログラムは、どういう意味でしょうか?ご教授いただけないでしょうか?すみません。
退会済みユーザー

退会済みユーザー

2021/04/25 07:31

> 省略されているものは何でしょうか? 画像の本によると、「プログラマが記述する」となっていますー。その部分を自分は、省略としました。 > このプログラムは、どういう意味でしょうか? 画像(本)によると、プログラムには意味はなくて、Windowsのコンパイルとリンクの説明をするものだと思いますー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問