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

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

プログラムの作成

Cのプログラムはメモ帳などのエディタで作成します。サクラエディタ、notepad++, MkEditor などがお薦めです。 拡張子は通常 .c です。

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

#include <stdio.h>

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

    return 0;
}

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

コマンドプロンプト

作成したプログラムのコンパイルは 「Developer Command Prompt for VS2017」(Visual Studio 2017 の場合です。 他のバージョンの場合も同じような名前のはずです。) から行ないます。 コマンドプロンプトはキーボードからコマンドを入力して実行する時に使用するウインドウです。通常(Windows 10 の場合)「開発者コマンド プロンプト」は「よく使うアプリ」の ─「Visual Studio 2017」 ─ 「Developer Command Prompt for 2017」から起動します。

まず コマンドプロンプトの作業フォルダを 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 

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

コマンドプロンプトでのコピーとペースト

コマンドプロンプトでは通常のショートカットキー(Control-C と Control-V)でコピー・ペーストの操作ができません。コマンドプロンプトのウインドウの 左上の小さなアイコン: (下図の赤線で囲ったところ)

commandPrompt.png

をクリックし、「編集」─ 「コピー」または「貼り付け」を選びます。

パイプとリダイレクト

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

コマンド > ファイル名
コマンド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() {
        int i;
        for(i=0; i<10; i++) { 
            printf("hello, world\n");
        }  
        return 0;
    }
  2. #include <stdio.h>
    
    int main() {
        int i;
        for(i=0; i<9; i++) { 
            printf("%d行目\n", i);
        }
        return 0;
    }
「プログラミング」のホームページ
Koji Kagawa