Linux講座にようこそ。このページは「C言語プログラミング入門 - 第1章 C言語の基礎知識」です。
ここでは、C言語でプログラムを作成する際に必要な基本的な約束事と必要な作業を説明します。
C言語の基本構造を説明するための簡単なプログラムといえば、やはりHello Worldプログラムでしょう。ここでも、「Hello World」メッセージを標準出力に出力するプログラムを例題として取り上げて、C言語の基本構造を説明します。
C言語に限らず、プログラムはテキストエディタを使ってファイルに記述します。このファイルをソースプログラムファイルあるいは、単にソースファイルと呼んでいます。下記がHello Worldプログラムのソースファイルの内容です。左端の「1.」や「2.」は説明をしやすくするために付けた行番号ですので、実際のソースファイルには記述しませんので注意してください。
↑ 行番号です。実際のソースファイルには記述しません
ここでは、C言語で記述したソースファイルを元に、コンピュータで実際に動作するプログラムを作成する方法を説明します。
言語によってはソースファイルを作ればすぐにコンピュータで実行できるものも有りますが、C言語の場合は実行できません。
C言語の場合はコンパイルとリンクという作業を行って、コンピュータで実行できる形式のプログラムを格納した「実行可能プログラムファイル」を作る必要が有ります。このプログラムはコンピュータが直接実行できるマシン語と呼ぶ言語に翻訳されたものですので、コンピュータの性能をフルに引き出すことができます。なお、実行可能プログラムファイルは一般的には「実行ファイル(Executable file)」や「実行形式ファイル」と呼ばれていますが、当講座では以降「実行可能ファイル」と記述します。
コンパイルはソースファイルの内容をコンピュータが解釈できるマシン語に翻訳する作業です。コンパイルを行うプログラムをコンパイラと呼んでおり、コンパイラはC言語で記述されたプログラムをアセンブリと呼ぶ言語(アセンブリ言語:マシン語に1対1に対応したような言語)に翻訳した後、アセンブラと呼ぶ翻訳プログラムを使ってマシン語プログラムに翻訳します。
この状態のプログラムファイルを「オブジェクトプログラムファイル」または、オブジェクトファイルと呼んでいます。リンクは複数のオブジェクトファイルや、ライブラリと呼ぶ部品プログラム等を連結して実行可能ファイルを作ります。
ここでは、多くのLinuxディストリビューションに標準的に含まれているgcc(GNU project C Compiler)コマンドを使用して実行可能ファイルを作り、実行する方法を説明します。
ここで説明する機能はgccコマンドのほんの一部だけです。全ての機能を知りたい場合はmanコマンド等で調べてください。なお、下記コマンド形式で括弧で括っている部分は省略可能を表しています。
gccコマンドを実行すると、コンパイルとリンクを行い、実行可能ファイルを作成します。ただし、ソースファイルに文法的な誤りがある場合は、エラーメッセージを出力して終了してしまいます。そういう場合は誤りを修正して、再度gccを実行します。
実行可能ファイルを実行するにはターミナル上で、実行可能ファイルのパス名を指定します。プログラムの入出力が標準入出力になっていれば、シェルの機能のリダイレクションやパイプラインが使えます。
作成したプログラムを特定のディレクトリの下に集めておき、ディレクトリのパス名をコマンドサーチパス(環境変数PATH)として登録しておけば、実行可能ファイル名だけで実行できます。詳細は「Linuxの使い方 - ユーザ環境の設定」をご覧ください。
ここでは、先にあげたHello Worldプログラムをコンパイルして実行します。ソースファイル名はex01_1.cで、カレントディレクトリに作成してあることとします。
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!! $
コマンドサーチパス(環境変数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!! $