Linux講座にようこそ。このページは「C言語プログラミング入門 - 第1章 C言語の基礎知識」です。

C言語プログラミング入門

1. C言語の基礎知識

1.1 C言語の基本構造

ここでは、C言語でプログラムを作成する際に必要な基本的な約束事と必要な作業を説明します。

C言語の基本構造を説明するための簡単なプログラムといえば、やはりHello Worldプログラムでしょう。ここでも、「Hello World」メッセージを標準出力に出力するプログラムを例題として取り上げて、C言語の基本構造を説明します。

1.1.1 例題

C言語に限らず、プログラムはテキストエディタを使ってファイルに記述します。このファイルをソースプログラムファイルあるいは、単にソースファイルと呼んでいます。下記がHello Worldプログラムのソースファイルの内容です。左端の「1.」や「2.」は説明をしやすくするために付けた行番号ですので、実際のソースファイルには記述しませんので注意してください。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     printf("Hello World!!\n");
  5.  
  6.     return 0;
  7. }
↑ 行番号です。実際のソースファイルには記述しません
1行目
ヘッダファイルと呼ぶファイルを取り込むための指示を行います。詳しい説明は後ほど行いますので、ここでは標準入出力を行うときに必要な手続きであると思っていただく程度で十分です。
2行目
プログラムの入口です。複数のソースファイルで構成するプログラムも、ここから実行を開始します。この行は必須です。
3行目から7行目
プログラムの本体です。本体は3行目の{(左中括弧)と、7行目の}(右中括弧)で括ります。
4行目
標準出力に「Hello World!!」メッセージを出力する命令です。出力するメッセージは"(引用符)で括ります。このようにプログラムの本体に記述する命令を「」と呼んでいます。文は;(セミコロン)で区切ります。
6行目
プログラムの出口です。指定した値(この場合は0)を呼び出し元に戻して終了します。

1.2 コンパイルと実行

ここでは、C言語で記述したソースファイルを元に、コンピュータで実際に動作するプログラムを作成する方法を説明します。

プログラム作成手順
【図1-1】プログラム作成手順

言語によってはソースファイルを作ればすぐにコンピュータで実行できるものも有りますが、C言語の場合は実行できません。

C言語の場合はコンパイルとリンクという作業を行って、コンピュータで実行できる形式のプログラムを格納した「実行可能プログラムファイル」を作る必要が有ります。このプログラムはコンピュータが直接実行できるマシン語と呼ぶ言語に翻訳されたものですので、コンピュータの性能をフルに引き出すことができます。なお、実行可能プログラムファイルは一般的には「実行ファイル(Executable file)」や「実行形式ファイル」と呼ばれていますが、当講座では以降「実行可能ファイル」と記述します。

コンパイルはソースファイルの内容をコンピュータが解釈できるマシン語に翻訳する作業です。コンパイルを行うプログラムをコンパイラと呼んでおり、コンパイラはC言語で記述されたプログラムをアセンブリと呼ぶ言語(アセンブリ言語:マシン語に1対1に対応したような言語)に翻訳した後、アセンブラと呼ぶ翻訳プログラムを使ってマシン語プログラムに翻訳します。

この状態のプログラムファイルを「オブジェクトプログラムファイル」または、オブジェクトファイルと呼んでいます。リンクは複数のオブジェクトファイルや、ライブラリと呼ぶ部品プログラム等を連結して実行可能ファイルを作ります。

ここでは、多くのLinuxディストリビューションに標準的に含まれているgcc(GNU project C Compiler)コマンドを使用して実行可能ファイルを作り、実行する方法を説明します。

1.2.1 gccコマンドの一般形式

ここで説明する機能はgccコマンドのほんの一部だけです。全ての機能を知りたい場合はmanコマンド等で調べてください。なお、下記コマンド形式で括弧で括っている部分は省略可能を表しています。

gccコマンドを実行すると、コンパイルとリンクを行い、実行可能ファイルを作成します。ただし、ソースファイルに文法的な誤りがある場合は、エラーメッセージを出力して終了してしまいます。そういう場合は誤りを修正して、再度gccを実行します。

$ gcc [-o 実行可能ファイル] ソースファイル1 [ソースファイル2 …]
-o 実行可能ファイル
実行可能ファイルのパス名を指定します。当オプションを省略した場合は、カレントディレクトリの下に「a.out」という名前で作ります。
ソースファイル1
ソースファイルのパス名を指定します。ソースファイルの拡張子は「.c」と決まっていますので、エディタでソースファイルを作るときに注意してください。C言語の場合、1つのプログラムを複数のソースファイルに分割して作ることができますので、複数のソースファイルを指定できるようになっています。

1.2.2 実行方法

実行可能ファイルを実行するにはターミナル上で、実行可能ファイルのパス名を指定します。プログラムの入出力が標準入出力になっていれば、シェルの機能のリダイレクションやパイプラインが使えます。

$ ./実行可能ファイル ← カレントディレクトリに有る実行可能ファイルを実行します
$
$ ~/mybin/実行可能ファイル ← ホームディレクトリの下のmybinディレクトリに有る実行可能ファイルを実行します
$
$ ./実行可能ファイル > 出力ファイル ← 標準出力を出力ファイルにリダイレクトします
$
$ ./実行可能ファイル | コマンド1 ← 標準出力をパイプラインでコマンド1に送ります

作成したプログラムを特定のディレクトリの下に集めておき、ディレクトリのパス名をコマンドサーチパス(環境変数PATH)として登録しておけば、実行可能ファイル名だけで実行できます。詳細は「Linuxの使い方 - ユーザ環境の設定」をご覧ください。

1.2.3 例題

ここでは、先にあげたHello Worldプログラムをコンパイルして実行します。ソースファイル名はex01_1.cで、カレントディレクトリに作成してあることとします。

例題1

gccコマンドに-oオプションを指定して、実行可能ファイルをカレントディレクトリにex01_1.prgとして作成します。

$ ls -l ./ex01_1.c  ← ソースファイルを確認します
-rw------- 1 merry merry 80  4月 20 09:22 ./ex01_1.c
$ cat -n ./ex01_1.c  ← -nは行番号を付加するオプションです
     1  #include <stdio.h>
     2  int main()
     3  {
     4      printf("Hello World!!\n");
     5
     6      return 0;
     7  }
$ gcc -o ./ex01_1.prg ./ex01_1.c  ← gccコマンドでコンパイルを行います
$ ls -l ./ex01_1.*
-rw------- 1 merry merry   80  4月 20 09:22 ./ex01_1.c
-rwxr-xr-x 1 merry merry 8216  4月 20 10:07 ./ex01_1.prg ← 実行許可が与えられています
$
$ ex01_1.prg ← ファイル名(ex01_1.prg)だけで実行を試みます
bash: /home/merry/mybin/ex01_1.prg: No such file or directory ← ファイルが見つかりません
$
$ ./ex01_1.prg ← カレントディレクトリにあることを明示します
Hello World!! ← 実行結果です。\n(改行文字)も出力しますので、カーソルは次の行の先頭に移動します
$ echo $? ← return文により呼び出し元に戻した値(戻り値や終了ステータスと呼ばれる値)を表示します
0
$
$ ./ex01_1.prg > output.txt ← メッセージをoutput.txtファイルにリダイレクトします
$ cat output.txt
Hello World!!
$

例題2

コマンドサーチパス(環境変数PATH)に登録してある$HOME/mybin/ディレクトリに、例題1で作成したex01_1.prgをコピーして実行します。

$ echo $PATH  ← 環境変数PATHの内容を表示します
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/merry/mybin
$
$ cp ./ex01_1.prg $HOME/mybin ← $HOME/mybinにコピーします
$ ls -l $HOME/mybin/ex01_1.prg
-rwxr-xr-x 1 merry merry 8216  4月 20 10:13 /home/merry/mybin/ex01_1.prg
$
$ ex01_1.prg ← ファイル名(ex01_1.prg)だけで実行します
Hello World!!
$