C のプログラムの作成とコンパイルの手順

以下では Windows での C のプログラムの作成とコンパイルの手順を説明します。 「プログラミング」の授業では、Microsoft Visual Studio Community という処理系を使用します。

短い説明

  1. 「Developer Command Prompt」(開発者コマンド プロンプト)を「スタート」の ─「Visual Studio 20??」 ─ 「Developer Command Prompt for VS20??」から起動します。 (見つからないときは、虫眼鏡🔎 のところに devel とでも入力して探してください。)

  2. 「Developer Command Prompt」(開発者コマンド プロンプト)で、ソースファイルを置いた(置く予定の)ディレクトリーに移動 (cd 〜) します。

以下では hello.c という名前のソースファイルをエディターで作成した (あるいはどこかからダウンロードした)とします。 日本語が入っているときは文字コードは UTF-8 with BOM (UTF-8-BOM) で保存してください。

  1. 以下のコマンドでコンパイラーを実行します。

    cl hello.c
    

    これで、hello.exe というファイルができているはずです。(dir コマンドで確認できます。)

  2. 以下のコマンドで、このプログラムを実行します。

    hello
    

    なお、コマンドプロンプトではなく、PowerShell の場合は、次のコマンドになります。

    .\hello
    

なお、コマンドプロンプトや PowerShell ではカーソルキー( ↑ ,  ↓ )を使うと、 以前に入力したコマンドを呼び出すことができます。

この説明でわからない場合は、以下の長い説明を読んでください。

プログラムの作成

C のプログラムはメモ帳などのエディターで作成します。なお、サクラエディタ、notepad++ などのほうがよりお薦めです。 特に Visual Studio Code を強く推奨します。 拡張子は通常 .c です。 なお、サクラエディタの場合、「設定」−「共通設定」−「ファイル」−「ファイルの排他制御」 −「排他制御」を「しない」に変更しておくことをおすすめします。

次のような簡単なファイルを作成して、 hello.c というファイル名で保存して下さい。 (なお、日本語を含むファイルの場合、文字コードは BOM 付きの UTF-8 にするのが良いようです。)

#include <stdio.h>

int main(void) {
    printf("hello, world\n");

    return 0;
}

灰色の部分は C 言語の実行に必要な「お約束」で最初のあいだはこの部分は変わらないので、この形のまま使います。 printf は標準出力(通常は画面)に文字列を出力する関数(プログラム部品)です。 「\n」は改行を表します。

文字化けについて

ソースコードの中に日本語が含まれている場合、cl コマンドは(gcc コマンドも)、 ソースファイルの文字コードが UTF-8 でも Shift_JIS でも大抵は問題ないです(うまく文字コードを推定してくれます)が、たまに文字化けしたり、不具合が起きたりすることがあります。 そういう場合は、BOM 付きの UTF-8 (utf-8 with BOM) で保存してください。それでほとんど文字化けはなくなります。

gcc の場合

(BOM 付き、BOM なしにかかわらず)UTF-8 で保存したソースファイルをコンパイルして実行するとき、 出力される文字列が文字化けすることがあります。これは、 コマンドプロンプトのデフォルトの文字コードが Shift_JIS になっているのに、プログラムは UTF-8 で出力しているためと思われます。

コンパイラーによって、日本語の文字列を Shift_JIS に変換しているもの(cl など)と UTF-8 のままにするもの(gcc など)に別れるようです。

文字化けする場合は、次のコマンドを実行してコマンドプロンプトの文字コードを UTF-8 に変更してください。( はプロンプトです。)

▷ chcp 65001

逆にコマンドプロンプトの文字コードを Shift_JIS に戻すときは次のコマンドを実行してください。

▷ chcp 932

一旦、文字化けした変な文字を表示すると、 コマンドプロンプト自体の状態が変になってしまうことがあるので、 念のため、コマンドプロンプトを開き直してから chcp してください。

また、どうしてもコマンドプロンプトで文字化けするときは(例えば、日本語版でない Windows でフォントがインストーすされていないときは)、 ファイルにリダイレクトしてからエディターで見るのも一つの手段です。

hello > out.txt

(このあと out.txt をエディターで開きます。)

別の方法として、コンパイラーのコマンドラインオプションでソースファイルの文字コードを指定することもできます。 例えば clの場合は /source-charset: というオプションを使います。 (上が UTF-8 の場合、下が Shift_JIS の場合)

▷ cl /source-charset:utf-8 hello.c
▷ cl /source-charset:shift_jis hello.c
また、あまり使わないかもしれませんが実行時の文字コードを指定するには /execution-charset: というオプションを使います。
▷ cl /source-charset:utf-8 /execution-charset:shift_jis hello.c
▷ cl /source-charset:shift_jis /execution-charset:shift_jis hello.c

また gcc の場合はソースファイルの文字コードの指定は -finput-charset= というオプションです。(上が UTF-8 の場合、下が Shift_JIS の場合)

▷ gcc -finput-charset=utf-8 hello.c
▷ gcc -finput-charset=cp932 hello.c

実行時の文字コードを指定するときは gcc の場合 -fexec-charset= というオプションになります。

▷ gcc -finput-charset=utf-8 -fexec-charset=cp932 hello.c
▷ gcc -finput-charset=cp932 -fexec-charset=cp932 hello.c

コマンドプロンプト

作成したプログラムのコンパイルは 「Developer Command Prompt for VS2019」(Visual Studio 2019 の場合です。 他のバージョンの場合も同じような名前のはずなので適当に読み替えてください。) から行ないます。 コマンドプロンプトはキーボードからコマンドを入力して実行する時に使用するウインドウです。通常(Windows 10 の場合)「Developer Command Prompt」は「よく使うアプリ」の ─「Visual Studio 2019」 ─ 「Developer Command Prompt for 2019」から起動します。 (見つからないときは、虫眼鏡🔎 のところに devel とでも入力して探してください。)

まず コマンドプロンプトの作業フォルダーを C のプログラム hello.c を置いたフォルダーに移動する必要があります。 フォルダーの移動は cdchange directory)というコマンドを使用します。

cd パス

例えば、c:\homeというフォルダーにプログラムを作成した時は

C:SomePath>cd \home
C:\home>

と入力します。コマンドプロンプトが出力する、入力を促す文字列プロンプト)が、 C:\home> に変わるはずです。 なお、 \Program Files のようにパスのなかに空白文字が含まれている場合は、 パスを二重引用符で囲んで、

C:SomePath>cd "\Program Files"
C:\Program Files>

のように入力する必要があります。 パスはもちろん絶対パスでも相対パスでも構いません。 特に一つ上のフォルダーに移動する時は、

C:\Users\sXXtXXX\Documents>cd ..
C:\Users\sXXtXXX>

で OKです。

フォルダーを移動したら、本当に作成した C のプログラムのファイルがそこにあるか、確認しておきます。 フォルダーの中にあるファイルの一覧を表示するには、dir というコマンドを使用します。

C:\Users\sXXtXXX\Documents\Programming>dir
 ドライブ C: のボリュームラベルはありません.
 ボリュームシリアル番号は XXXX-YYYY です。
 C:\Users\sXXtXXX\Documents\Programming のディレクトリ

yy-mm-dd  hh:mm    <DIR>         .
yy-mm-dd  hh:mm    <DIR>         ..
(省略)
yy-mm-dd  hh:mm                     83 hello.c
(省略)
         ? 個のファイル              ? バイト
         ? 個のディレクトリ          ? バイトの空き領域

このような感じで hello.c の名前が表示されれば OK です。

パス

パスとは、C:\Users\sXXtXXX\Documents\Programming\hello.c のように ファイルやディレクトリーの場所を表す文字列です。エクスプローラーで「場所」の左端のアイコン (下図の赤線で囲ったところ)

path.png

をクリックしたときに表示される文字列です。

パスには絶対パスと 相対パスがあります。 先頭に「\」がついているかどうかで、絶対パスと相対パスを区別します。 先頭に「\」がついていれば絶対パスです。

絶対パスとは “\Users\sXXtXXX\Documents\Programming\hello.c” のように場所を省略することなく、すべて記述したものです。このパスは Users フォルダーの中の sXXtXXX フォルダーの中の Documents フォルダーの中の Programming フォルダーの中の hello.c というファイルを表します。 (Window 系の場合、ファイルの位置を示すためには、パスの前に C: のような 「ドライブ名」が必要になります。)

相対パスは絶対パスの最初のいくつかの部分を省略したものです。 現在のディレクトリーのパスに対する相対的な位置を表します。 特に単にファイル名を書けば、そのディレクトリーにあるファイルを表します。 例えば、\Users\sXXtXXX\Documents\Programming\ というパスで表されているディレクトリーから、hello.exe という相対パスで参照されるファイルの絶対パスは \Users\sXXtXXX\Documents\Programming\hello.exe です。

下の例は現在のディレクトリーのパスが \Users\sXXtXXX\Documents\Programming\ の場合です。

相対パス絶対パス
hello.c \Users\sXXtXXX\Documents\Programming\hello.c
Examples\bonjour.c \Users\sXXtXXX\Documents\Programming\Examples\bonjour.c
..\ProgLang\sawadi.c \Users\sXXtXXX\Documents\ProgLang\sawadi.c

..」は一つ上の階層(親ディレクトリー)を表します。

コンパイル

コンパイルは clというコマンドを使用します。

cl ソースファイル名

テキストエディターで作成したファイルも、コンパイルの結果できるファイルも、 「プログラム」と呼ぶので、前者をソースファイル、 後者を実行可能ファイルと呼びます。

C:\Users\sXXtXXX\Documents\Programming> cl hello.c
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.c
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
hello.obj
C:\Users\sXXtXXX\Documents\Programming> 

コンパイルに成功すれば、ソースファイルのファイル名の拡張子だけを .exe に変えたファイルができているはずです。 これが実行可能ファイルです。

C:\Users\sXXtXXX\Documents\Programming>dir
 ドライブ C のボリューム ラベルがありません.
 ボリューム シリアル番号は XXXX-YYYY です。
 C:\Users\sXXtXXX\Documents\Programming のディレクトリ

yy-mm-dd  hh:mm    <DIR>         .
yy-mm-dd  hh:mm    <DIR>         ..
(省略)
yy-mm-dd  hh:mm                     83 hello.c
yy-mm-dd  hh:mm                 52,224 hello.exe
(省略)
         ? 個のファイル              ? バイト
         ? 個のディレクトリ          ? バイトの空き領域

なお、cl の場合、拡張子が .obj のファイルもできていると思いますが、これらは中間生成物です。 プログラムの実行には必要ありません。

実行可能ファイルはそのファイル名を入力すると実行できます。 (拡張子の .exe は省略できます。)

C:\Users\sXXtXXX\Documents\Programming>hello
hello, world 

コマンドプロンプトではなくて PowerShell を使っている場合は、作業ディレクトリーからコマンドを探さないので .\ を前につけてください。

C:\Users\sXXtXXX\Documents\Programming>.\hello
hello, world   

なお、ソースファイルの中に何か間違いがあってうまくコンパイルできないことの方が普通です。 エラーメッセージには何行めがエラーになっているか、という情報が書かれていますので、良く読んで、再びエディターでソースファイルを編集して、 コンパイルしなおします。

パイプとリダイレクト

少し長いプログラムをコンパイルすると、エラーメッセージが コマンドプロンプトの画面に入り切らないということが起こります。 そういうときは、プログラムの出力を画面ではなく、ファイルや 他のコマンドの入力に切替えるリダイレクトという 手法を使います。

コマンド > ファイル名
コマンド1 | コマンド2

>」の方はコマンドの結果をファイルに出力します。 このファイルをテキストエディタで見れば良いわけです。 「|」はコマンド1の出力を、コマンド2の入力として渡します。 コマンド2としては more というコマンドが良く使われます。 more は長いテキストを画面におさまる範囲ずつ表示するプログラムです

C:\Users\sXXtXXX\Documents\Programming>cl hello.c > error.txt
C:\Users\sXXtXXX\Documents\Programming>cl hello.c | more

その他

cls というコマンドで画面を消去します.

カーソルキーの上向きキー ↑ で、以前に実行したコマンドが表示されます。 行き過ぎたら下向きキー ↓ で戻ります。

確認

次のプログラムをコンパイルして、実行結果を確認してください。 また、定数の値などを少し変えてコンパイルしてください。

  1. #include <stdio.h>
    
    int main(void) {
        int i;
        for (i = 0; i < 10; i++) { 
            printf("hello, world\n");
        }  
        return 0;
    }
  2. #include <stdio.h>
    
    int main(void) {
        int i;
        for (i = 0; i < 9; i++) { 
            printf("%d行目\n", i);
        }
        return 0;
    }
「プログラミング」のホームページ
Koji Kagawa