カーニハン&リッチーの「プログラム言語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"); }

 このプログラムは,printfprint と書き間違えています.文法は正しいのでコンパイルエラーにはならず,ライブラリから 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
Last modified: Wednesday, 9 April 2025, 10:08 PM