Hell World
カーニハン&リッチーの「プログラム言語C」から延々と続く,第一発目のプログラムの定番 "Hello World ".
しかし,そこはそれ,捻くれ者の筆者なので,”おっと o を書き落としちゃった”と言うことで,"Hell World ".地獄の世界へようこそ.
用意するものは C言語のコンパイラです.Linux があれば無料のCコンパイラ(gcc)が使えるので重宝します.
一応この記事では,Linux を前提として話を進めます.Linux が手元に無い人はこの機会に Linux のインストールに挑戦してみるのもよいでしょう.
Linux なんか知らないという人は Windows に CYGWIN をインストールしても良いでしょう.
先ずはエディタ(vi お勧め.emacsでも可)で次のプログラムを hell.c として作成します.
#include <stdio.h> int main(void)
{ printf("Hell World\n"); }
これを,コンパイル・リンク・実行するには
$ gcc hell.c -o hell
$ ./hell
とします.
gcc はソースコード hell.c を読み込んで,「プリプロセッサ」「コンパイラ」「リンカ」の順に自動的に呼び出します.
#include <stdio.h> は「プリプロセッサ」(前処理プログラム)により処理され,プログラム中に /usr/include/stdio.h の内容がそのまま展開されます.
/usr/include/stdio.h の中には printf の型の定義(どういう引数が必要で何を返すか)などが記述されています.
「コンパイラ」は「プリプロセッサ」により処理されたソースコードを機械語に翻訳し,オブジェクトコードを生成します.
「リンカ」は「コンパイラ」により生成されたオブジェクトコードとライブラリ(ここでは printf の実体)を結合して,実行可能形式のファイルを作成します.
-o を指定すると,実行可能形式のファイル名を指定できます.省略すると,一律 a.out になります.
C言語は必ず main() 関数から始まります.int main(void) は main() と省略することもできます(厳密にやれば警告が出る可能性がある).
printf() は引数を「標準出力」に出力する関数です.
綴り等に間違いがあるとコンパイルエラーになります.例えば
#include <stdio.h> int main(void)
{ printf("Hell World\n); }
の場合,Hell World\n の最後のダブルクォーテーションが落ちているのですが,
hell.c:5:16: " 文字での終端を欠いています hell.c: 関数 `main' 内: hell.c:7: error: 文法エラー before '}' token
のような文法エラーが発生します.文法エラーは,最初の方のエラーから修正していきます.最初のエラーが後ろの方のエラーの原因になっている場合があるからです.
この場合は 5行目をよくチェックします.
また,関数の名前を間違えた場合などは,リンクエラー(ライブラリの結合の失敗)となります.
#include <stdio.h> int main(void)
{ print("Hell World\n"); }
このプログラムは,printf を print と書き間違えています.文法は正しいのでコンパイルエラーにはならず,ライブラリから print 関数を結合しようとした時点で,print関数が見つからず,結合エラー(リンクエラー)となります.
/tmp/ccYgIW9v.o(.text+0x19): In function `main': : undefined reference to `print' collect2:
ld はステータス 1 で終了しました
undefined reference は「定義されていない参照」,つまり「print が見つからないよ」というエラーです.
エラーが発生した場合は,エディタで hell.c を編集しなおします.
ただしくコンパイル・リンクが終了した場合は,何もメッセージは出ません.そのまま続けて ./hell と入力するとプログラムを実行することができます.
$ gcc hell.c -o hell
$ ./hell
Hell World