C言語


# C言語

2013年06月25日
情報科学類 コンピュータリテラシ
筑波大学 システム情報系 情報工学域
新城 靖
<yas@cs.tsukuba.ac.jp>

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

## ■C言語

## プログラミング言語の１つ。
情報科学類の必修科目で必要となる。

システムプログラミング序論(2年次)

その他、次のような科目で必要になる。

オペレーティング・システムに関連した科目。
オペレーティング・システムの多くは、C 言語で記述されている。
画像等、特に速度が求められる対象を扱う科目。
卒業研究

コンピュータ・リテラシでは、夏休みに予習するために、Ｃ言語で書いたプロ
グラムをどうやって学類のコンピュータで動作させるかを説明する。

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

### ◆ccコマンド

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

$ mkdir ~/c_progs
$ cd ~/c_progs
$ ls
（何も表示されない。mkdir 直後は、ディレクトリは空。）
$ cp ~yas/public_html/coins/literacy-2013/2013-06-25/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)
$

mkdir コマンドで C 言語のプログラムを保存するためのディレクトリを
作成している。この例では、c_progs で C programs の意味。
各自、自分の分かりやすい名前に置き換えること。
cp コマンドで、例題をコピーしている。
ls コマンドでコピーできたことを確認している。
cat コマンドで、内容を確認している。
cc コマンドで、「コンパイル（とリンク）」を行っている。
Ｃ言語で書かれたソース・プログラムを、
CPU により実行可能な機械語へ変換している。
変換された実行可能なプログラムは、a.out という
ファイルに保存される。
ls コマンドで、a.out というファイルが作られたことを確認している。
「./a.out」と打つと、
カレントワーキングディレクトリにある
「a.out」という名前のファイルに含まれている
プログラムが実行される（
オペレーティング・システムにより
プロセスが作られ、
機械語命令がファイルからメモリにコピーされ、
CPU により実行される。
）。

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: In function 'main':
error.c:8: error: parse error before '}' token
$

この場合は、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言語のソース・プログラムは、２種類に分類される。

拡張子 .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 オプションで
ディレクトリのパス名を与える。

### ◆分割コンパイル

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

例：f1.c, f2.c, f3.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: 2013/06/25 10:37:45