C言語の問題 Level 5

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

C言語の問題 Level 5

投稿記事 by beatle » 12年前

私の日記へは答えを投稿しないでください

Level 5は問題の毛色を変えてみました.Level 1~Level 4と大分違う系統の問題で,Level 5にするかどうかで迷いましたが,これくらいは知っててほしいなあということでLevel 5にしました.
個人的には,この問題に自信を持って答えられるくらいの力があれば,C言語については初心者を脱していると言って良いと思います.

問題(Level 5)
コンパイルとリンクの違いを説明してください.

また,下記のcommon.h,a.c,b.cを用いて実行可能ファイルを作ろうとすると,次のようなエラーになってしまいました.
3つのファイルをそれぞれどう修正したらいいでしょうか?(すべてのファイルの修正が必要とは限りません)
ちなみに,作ろうとしているプログラムは,標準出力に

CODE:

hit point = 200
hit point = 100
と出力するものです.

エラーメッセージ

CODE:

$ gcc a.o b.o
b.o:b.c:(.bss+0x0): multiple definition of `hit_point'
a.o:a.c:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
common.h

CODE:

int hit_point = 200;
void PrintHitPoint(void);
a.c

CODE:

#include "common.h"
int main(void)
{
    PrintHitPoint();
    hit_point = 100;
    PrintHitPoint();
    return 0;
}
b.c

CODE:

#include "common.h"
#include 
void PrintHitPoint(void)
{
    printf("hit point = %d\n", hit_point);
}
最後に編集したユーザー beatle on 2012年1月25日(水) 16:52 [ 編集 6 回目 ]

アバター
へろりくしょん
記事: 92
登録日時: 13年前

Re: C言語の問題 Level 5

投稿記事 by へろりくしょん » 12年前

プログラムの意図が不明瞭な気がします。

例えば、hit_piont に static 記憶クラス指定子を与えれば、リンクは通りますが、意図した動きではありませんよね。

入門者の入門者的な経験則から、ヘッダファイルで宣言された変数は、static にすればいい。 と機械的に覚えている人も少なからずいるはずです。


#コメント書いてる間に修正されてる。 なんか、失礼しました。
最後に編集したユーザー へろりくしょん on 2012年1月25日(水) 16:13 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 13年前

Re: C言語の問題 Level 5

投稿記事 by ISLe » 12年前

変数の外部参照を覚えてどんなメリットがあるんでしょう。
余計な刷り込みで将来苦しむだけなので入門レベルでは華麗にスルーして欲しいと思いますけど。

外部参照使わないコードに書き換えることを期待した問題だったらごめんなさい。
でもそれならレベル30くらいの価値があると思います。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: C言語の問題 Level 5

投稿記事 by beatle » 12年前

ISLeさん.
そうですね.グローバル変数はなるべくなら使いたくありませんね.もし僕が入門書を書くとしたら,なるべくグローバル変数を使わない方向に持っていきたいです.
しかしC言語掲示板を見ていると,入門レベルの方々からの,多重定義のエラーに関する質問はそれなりの数がありますから,外部参照に触れない訳にもいかないと思いまして,今回の出題に踏み切りました.正直,Level 5にして良い問題かは悩みましたけれど.
ISLe さんが書きました:変数の外部参照を覚えてどんなメリットがあるんでしょう。
質問掲示板でこの手のエラーに関する質問に答えられるようになる,というメリットがあります.

一つ断っておくと,僕が作っている問題は入門書ではなく,C言語への習熟度を測る指標です.
問題に対する理想的な解答を示している訳ではありませんので,ご注意下さい.