C言語

					2017年06月16日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2017/2017-06-16 /c-lang.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■C言語

プログラミング言語の1つ。 情報科学類の必修科目で必要となる。 その他、次のような科目で必要になる。 コンピュータ・リテラシでは、夏休みに予習するために、C言語で書いたプロ グラムをどうやって学類のコンピュータで動作させるかを説明する。

The Unix Super Text 第57章 Cの使いかた 参照

◆ccコマンド

C言語のソース・プログラムは、Emacs などのテキスト・エディタで 作成する。Cコンパイラは、cc (または gcc)というコマンドで、 端末の中でシェルから実行するのが一般的。

$ mkdir ~/c_progs [←]
$ cd ~/c_progs [←]
$ ls [←]
(何も表示されない。mkdir 直後は、ディレクトリは空。)
$ cp ~yas/public_html/htdocs/coins/literacy-2017/2017-06-16/ex/hello.c . [←]
$ ls [←]
hello.c
$ cat hello.c  [←]
#include <stdio.h>

#define NAME "(name)"

int main()
{
        printf("Hello, %s\n", NAME );
}
$ cc hello.c  [←]
$ ls [←]
a.out   hello.c
$ ./a.out  [←]
Hello, (name)
$ []
cc は、C compiler の意味。gcc は、GNU project が開発している cc の意味。 MacOSX では、cc と打っても gcc が実行される。

◆エラー

(C言語で)プログラムを記述していると、エラーの山に遭遇する。人間は間違え るものであることをさとることになる。エラーにいちいちめげていてはプログ ラムは書けない。
$ cat error.c  [←]
#include <stdio.h>

#define	 NAME "(name)"

int main()
{
	printf("Hello, %s\n", NAME )
}
$ cc error.c  [←]
error.c:7:30: error: expected ';' after expression
        printf("Hello, %s\n", NAME )
                                    ^
                                    ;
1 error generated.
$ []
この場合は、cc は、実行ファイルを作らない。 ファイル名と行番号をたよりに、プログラムを修正して、 エラーが出なくなるまで cc を実行する。

コンパイル・エラーがでなくなっても、プログラムは完成ではない。コンパイ ラにはわからない(分かり得ない) 間違いは残っている可能性がある。

◆cc -o

cc コマンドに -o オプションを付けると、a.out ではなく、-o の次に与えら れた名前のファイルに実行可能なプログラムが保存される。
$ ls [←]
a.out   hello.c
$ rm a.out  [←]
$ ls [←]
hello.c
$ cc -o hello hello.c  [←]
$ ls [←]
hello   hello.c
$ ./hello  [←]
Hello, (name)
$ []
C言語のソース・プログラムは、2種類に分類される。
拡張子 .c
関数定義を記述する。 C言語のプログラムは、 関数と呼ばれる小さなプログラムの集合で構成される。
拡張子 .h (ヘッダ・ファイル)
定数やデータ構造の定義を記述する。 複数の .c のプログラムに、#include で読み込まれる。
stdio.h などのヘッダ・ファイルは、/usr/include/ 以下に ある。他の場所にある時には、cc コマンドに -I オプションで 指定する。

◆ライブラリ

(大きな)プログラムを記述する時に共通で使える 関数(小さな プログラム)を集めたもの。cc コマンドは、libc (library C)という ライブラリにある関数を標準で自動的に取り出して結合する(リンクする)。 libc などよくつかわれるライブラリは、 /usr/lib にある。

libc 以外のライブラリを使う時には、cc に -l オプションを付ける。 たとえば、三角関数 sin(), 指数関数 exp() 等を使う時には、-lm (mathematicsの意味)を指定する。 /usr/lib 以外の場所にあるライブラリを使うには、-L オプションで ディレクトリのパス名を与える。

◆分割コンパイル

大きなプログラムは、1つのファイルには入りきらない。複数のファイルに含 まれたC言語のソース・プログラムをコンパイルして、1つのプログラムにまと める(リンクする)ことができる。

例:f1.c, f2.c, f3.c という3つのファイルに含まれているC言語のプログラ ムをすべてコンパイルして、リンクし、完成した実行可能なプログラムを prog という名前のファイルに保存する。

$ ls f1.c f2.c f3.c [←]
f1.c    f2.c    f3.c
$ cc -o prog f1.c f2.c f3.c [←]
$ []
毎回、全部のファイルをコンパイルすると、遅い。 ソース・ファイルを変更したプログラムだけをコンパイルしたい。
$ ls f*.c [←]
f1.c    f2.c    f3.c
$ ls f1.* [←]
f1.c
$ cc -c f1.c [←]
$ ls f1.* [←]
f1.c    f1.o
$ ls f2.* [←]
f2.c
$ cc -c f2.c [←]
$ ls f2.* [←]
f2.c    f2.o
$ ls f3.* [←]
f3.c
$ cc -c f3.c [←]
$ ls f3.* [←]
f3.c    f3.o
$ ls f*.c [←]
f1.c    f2.c    f3.c
$ ls f*.o [←]
f1.o    f2.o    f3.o
$ cc -o prog f1.o f2.o f3.o [←]
$ ./prog  [←]
This is main().
This is f1().
This is f2().
This is f3().
$ []

◆makeコマンド

The Unix Super Text 第59.1節 make 参照

(分割)コンパイルを楽にするためのプログラム。 どのようなファイルをコンパイルすればよいかの 定義を与えると、ファイルの日付を比較して、 自動的にコンパイルとリンクを行う。

$ ls *.c [←]
f1.c    f2.c    f3.c    hello.c
$ ls *.o [←]
ls: *.o: No such file or directory
$ cat Makefile [←]
all: prog
objs = f1.o f2.o f3.o
prog: $(objs)
        $(CC) -o prog $(objs)
$ make [←]
cc    -c -o f1.o f1.c
cc    -c -o f2.o f2.c
cc    -c -o f3.o f3.c
cc -o prog f1.o f2.o f3.o
$ ls *.c *.o prog [←]
f1.c    f1.o    f2.c    f2.o    f3.c    f3.o    hello.c prog
$ []

◆Makefileの読み方

all: prog
objs = f1.o f2.o f3.o
prog: $(objs)
	$(CC) -o prog $(objs)
all: prog
make は標準で all というものを作る。 all とは prog のこと。
objs = f1.o f2.o f3.o
変数定義
prog: $(objs)
prog は、$(objs) に「依存」している。 つまり、prog は、 $(objs) にあるファイルよりも新しくなければならない。 古かったら、次の行のコマンドを実行して作り直す。
$(CC) -o prog $(objs)
cc コマンドを実行して作り直す。CC という変数には、 最初は cc 定義されている。後で必要な変更できる。
make ファイルを書くときの注意点。実行すべきコマンドを書くところは、空白 ではなく「タブ」を打つ。上のファイルでは、$(CC) の前はタブ。


Last updated: 2017/06/14 23:17:53
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>