以下では Windows での C のプログラムの作成とコンパイルの手順を説明します。 「プログラミング」の授業では、Microsoft Visual Studio Community という処理系を使用します。
「Developer Command Prompt」(開発者コマンド プロンプト)を「スタート」の ─「Visual Studio 20??」 ─ 「Developer Command Prompt for VS20??」から起動します。 (見つからないときは、虫眼鏡🔎 のところに devel とでも入力して探してください。)
「Developer Command Prompt」(開発者コマンド プロンプト)で、ソースファイルを置いた(置く予定の)ディレクトリーに移動 (cd 〜
) します。
以下では hello.c
という名前のソースファイルをエディターで作成した(あるいはどこかからダウンロードした)とします。
以下のコマンドでコンパイラーを実行します。
cl hello.c
これで、hello.exe
というファイルができているはずです。(dir
コマンドで確認できます。)
以下のコマンドで、このプログラムを実行します。
hello
なお、コマンドプロンプトではなく、PowerShell の場合は、次のコマンドになります。
.\hello
なお、コマンドプロンプトや PowerShell ではカーソルキー( ↑ , ↓ )を使うと、 以前に入力したコマンドを呼び出すことができます。
この説明でわからない場合は、以下の長い説明を読んでください。
C のプログラムはメモ帳などのエディタで作成します。なお、サクラエディタ、notepad++ などのほうがよりお薦めです。
特に Visual Studio Code を強く推奨します。
拡張子は通常 .c
です。
なお、サクラエディタの場合、「設定」−「共通設定」−「ファイル」−「ファイルの排他制御」
−「排他制御」を「しない」に変更しておくことをおすすめします。
次のような簡単なファイルを作成して、
hello.c
というファイル名で保存して下さい。
(なお、日本語を含むファイルの場合、文字コードは Visual Studio 2012 以降は
BOM 付きの UTF-8 にするのが良いようです。)
#include <stdio.h> int main(void) { printf("hello, world\n"); return 0; }
灰色の部分は C 言語の実行に必要な「お約束」で最初のあいだはこの部分は変わらないので、この形のまま使います。
printf
は標準出力(通常は画面)に文字列を出力する関数(プログラム部品)です。
「\n
」は改行を表します。
ソースコードの中に日本語が含まれている場合、cl
コマンドは、ソースファイルの文字コードが 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
してください。
また、どうしてもコマンドプロンプトで文字化けするときは、リダイレクトしてからエディターで見るのも一つの手段です。
▷ 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
を置いたフォルダに移動する必要があります。
フォルダの移動は cd
(change
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
のように
ファイルやディレクトリの場所を表す文字列です。エクスプローラで「場所」の左端のアイコン
(下図の赤線で囲ったところ)
をクリックしたときに表示される文字列です。
パスには絶対パスと 相対パスがあります。
先頭に「\
」がついているかどうかで、絶対パスと相対パスを区別します。
先頭に「\
」がついていれば絶対パスです。
絶対パスとは
“\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
というコマンドで画面を消去します.
カーソルキーの上向きキー ↑ で、以前に実行したコマンドが表示されます。 行き過ぎたら下向きキー ↓ で戻ります。
次のプログラムをコンパイルして、実行結果を確認してください。 また、定数の値などを少し変えてコンパイルしてください。
#include <stdio.h> int main(void) { int i; for (i = 0; i < 10; i++) { printf("hello, world\n"); } return 0; }
#include <stdio.h> int main(void) { int i; for (i = 0; i < 9; i++) { printf("%d行目\n", i); } return 0; }