C言語GUI入門|最初のコンソールプログラムを作成する

ここでは、最初のコンソールプログラムを保存するためのchap03ディレクトリを準備し、Visual Studio Codeでhello.cを作成します。

作成するプログラムは、ターミナルへHello, World!と表示するシンプルなものです。短いプログラムですが、C言語の基本となる次の要素が含まれています。

  • stdio.h
  • main関数
  • printf関数
  • return 0
  • 波かっこで囲まれた処理
  • 文の終わりを示すセミコロン

この記事では、次の順番で作業します。

chap03を確認する
        ↓
Visual Studio Codeでchap03を開く
        ↓
hello.cを作成する
        ↓
プログラムを入力する
        ↓
UTF-8で保存する
        ↓
プログラムの構造を確認する

コンパイルと実行の詳しい手順は、次の記事で解説します。この記事では、hello.cを正しい場所へ正しい文字コードで保存し、プログラムの内容を理解するところまで進めます。

chap03ディレクトリを準備する

最初に、通常のC言語プログラムを保存するchap03ディレクトリを確認します。

作成する場所は次のとおりです。

C:\cgui\chap03

MSYS2では、同じ場所を次のように表します。

/c/cgui/chap03

第2章で章ごとのディレクトリを作成している場合、chap03はすでに用意されています。その場合は、新しく作成する必要はありません。

エクスプローラーでC:\cguiを開き、chap03が表示されていることを確認してください。

C:\cgui
   ├─ chap03
   ├─ chap04
   ├─ chap05
   ├─ chap06
   ├─ chap07
   └─ chap08

chap03があれば、そのまま次の作業へ進みます。

chap03がない場合に作成する

第2章でchap03を作成していない場合は、エクスプローラーから作成できます。

  1. エクスプローラーを開きます。
  2. Cドライブを開きます。
  3. cguiフォルダーを開きます。
  4. 何もない場所を右クリックします。
  5. 「新規作成」を選択します。
  6. 「フォルダー」を選択します。
  7. フォルダー名としてchap03を入力します。
  8. Enterキーを押して名前を確定します。

作成後の構成は次のようになります。

C:\cgui
   └─ chap03

ディレクトリ名には、すべて半角英数字を使用します。

chap03

次のような名前になっていないか確認してください。

chap3
Chap03
chap 03
第3章

本コンテンツでは、小文字のchapと2桁の章番号を組み合わせたchap03を使用します。

図1:chap03にhello.cを作成する準備

この図から分かること

最初のコンソールプログラムは、C:\cgui\chap03へ保存します。

第2章でchap03を作成済みの場合は、そのディレクトリをそのまま利用できます。作成されていない場合だけ、新しくchap03を作成します。

Visual Studio Codeでchap03を開く

続いて、Visual Studio Codeでchap03を開きます。

  1. Visual Studio Codeを起動します。
  2. メニューバーから「ファイル」を選択します。
  3. 「フォルダーを開く」を選択します。
  4. Cドライブを開きます。
  5. cguiフォルダーを開きます。
  6. chap03フォルダーを選択します。
  7. 「フォルダーの選択」を押します。

正しく開くと、Visual Studio Codeの左側にあるエクスプローラーへchap03が表示されます。

CHAP03

Visual Studio Code上では大文字で表示されることがありますが、実際のディレクトリ名が変更されたわけではありません。

C:\cguiを開いた状態から作業する場合

Visual Studio CodeでC:\cguiを開いたまま作業することもできます。

その場合は、左側のエクスプローラーにあるchap03をクリックして展開します。

CGUI
 ├─ chap03
 ├─ chap04
 ├─ chap05
 ├─ chap06
 ├─ chap07
 └─ chap08

chap03を直接開く方法と、C:\cguiを開いてchap03を選ぶ方法のどちらでもかまいません。

ただし、新しいファイルを作成するときは、hello.cがchap03の中へ保存されることを確認してください。

ワークスペースの信頼を確認する

chap03を初めて開いたとき、Visual Studio Codeからフォルダー内のファイル作成者を信頼するか確認される場合があります。

今回使用するC:\cgui\chap03は、自分で作成した学習用ディレクトリです。場所を確認したうえで、信頼する操作を選択できます。

インターネットから取得した不明なフォルダーを開く場合は、内容を確認せずに信頼しないようにしましょう。

hello.cを作成する

Visual Studio Codeの左側にあるエクスプローラーから、新しいソースファイルを作成します。

  1. chap03が選択されていることを確認します。
  2. エクスプローラー上部の「新しいファイル」ボタンを押します。
  3. ファイル名としてhello.cを入力します。
  4. Enterキーを押して確定します。

作成後の構成は次のようになります。

C:\cgui\chap03
        └─ hello.c

hello.cの.cは、C言語のソースファイルであることを表す拡張子です。

部分意味
helloファイル名
.cC言語のソースファイルを表す拡張子
hello.c完全なファイル名

ファイル名は、半角英字の小文字でhello.cと入力します。

hello.c.txtになっていないか確認する

エクスプローラーからファイルを作成すると、Windowsの設定によってはhello.c.txtになってしまうことがあります。

Visual Studio Codeからhello.cを作成すれば、通常は正しい拡張子で保存されます。

次の名前が正しいファイル名です。

hello.c

次のような名前ではありません。

hello.c.txt
hello
Hello.c
hello.c

最後の例は、ピリオドが全角になっています。ファイル名には半角のピリオドを使用してください。

最初のプログラムを入力する

作成したhello.cを開き、次のプログラムを入力します。

Hello, World!と表示するプログラム

ファイル名:hello.c

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");

    return 0;
}

入力するときは、記号や大文字と小文字を正確に記述してください。

特に次の文字に注意します。

  • includeの前に#を付ける
  • stdio.hを山かっこで囲む
  • mainの後ろに丸かっこを付ける
  • 処理全体を波かっこで囲む
  • 表示する文字列をダブルクォーテーションで囲む
  • printfの行末にセミコロンを付ける
  • return 0の行末にセミコロンを付ける

図2:hello.cの基本構造

この図から分かること

短いhello.cにも、C言語プログラムの基本的な構造が含まれています。

stdio.hによって標準入出力機能を利用できるようにし、main関数の中へ実行する処理を記述します。printfで文字を表示し、return 0で正常終了を伝えます。

UTF-8で保存する

プログラムを入力したら、hello.cをUTF-8で保存します。

最初に、Ctrl+Sを押してファイルを保存します。

続いて、Visual Studio Codeの画面下部にあるステータスバーを確認します。文字コードがUTF-8になっていれば、そのままで問題ありません。

UTF-8

前の章でfiles.encodingをutf8に設定している場合、新しく作成したファイルは基本的にUTF-8で保存されます。

文字コードがUTF-8でない場合

画面下部にUTF-8以外の文字コードが表示されている場合は、次の手順で変更できます。

  1. ステータスバーの文字コード表示をクリックします。
  2. 「エンコード付きで保存」を選択します。
  3. 一覧からUTF-8を選択します。
  4. もう一度Ctrl+Sを押して保存します。

「エンコード付きで再度開く」と「エンコード付きで保存」は役割が異なります。

操作役割
エンコード付きで再度開く既存ファイルを指定した文字コードとして読み直す
エンコード付きで保存現在のファイルを指定した文字コードへ変換して保存する

今回のhello.cをUTF-8にする場合は、「エンコード付きで保存」を使用します。

UTF-8で保存する理由

今回表示するHello, World!は半角英数字だけなので、多くの文字コードで同じように扱えます。

それでも、最初からUTF-8へ統一しておくことが大切です。今後のプログラムでは、日本語のメッセージ、コメント、CSSファイルなどを扱う可能性があるためです。

UTF-8を使用すると、次のような利点があります。

  • 日本語を含むソースファイルを扱いやすい
  • Visual Studio CodeとMSYS2で文字コードを統一できる
  • 複数のファイルで文字コードが混在するのを防げる
  • 日本語の文字化けを避けやすい
  • GTK 4でUTF-8の文字列を扱いやすい

本コンテンツでは、C言語のソースファイルをUTF-8で保存します。

stdio.hとは

hello.cの先頭には、次の記述があります。

#include <stdio.h>

stdioはstandard input/outputを短くした名前です。日本語では標準入出力という意味になります。

stdio.hは、C言語の標準入出力に関する宣言をまとめたヘッダファイルです。

主に次のような機能を利用するときに読み込みます。

  • ターミナルへ文字を表示する
  • キーボードから値を入力する
  • ファイルからデータを読み込む
  • ファイルへデータを書き込む

今回使用するprintfも、stdio.hに宣言されています。

#includeの役割

#includeは、指定したヘッダファイルの情報を利用できるようにするためのプリプロセッサ指令です。

#include <stdio.h>

この記述によって、コンパイラーはprintfがどのような関数なのか確認できるようになります。

各部分の意味は次のとおりです。

記述意味
#プリプロセッサへの指示を表す
includeヘッダファイルの情報を取り込む
<stdio.h>利用する標準ヘッダファイル

#includeは関数ではありません。そのため、行末にセミコロンは付けません。

#include <stdio.h>

次のようには記述しません。

#include <stdio.h>;

stdio.hを読み込まないとどうなるか

stdio.hを読み込まずにprintfを使用すると、コンパイラーがprintfの正しい宣言を確認できません。

現在のC言語では、関数を適切に宣言してから使用する必要があります。そのため、printfを使用するときはstdio.hを読み込みます。

stdio.hを読み込む
        ↓
printfの宣言を利用できる
        ↓
コンパイラーが呼び出し方を確認できる

stdio.hにはprintfの処理そのものがすべて直接書かれているわけではありません。主に、printfを利用するために必要な宣言が含まれています。実際の機能はCの標準ライブラリから提供されます。

main関数とは

C言語のプログラムには、処理を始める中心となるmain関数があります。

今回のプログラムでは、次の部分です。

int main(void)
{
    printf("Hello, World!\n");

    return 0;
}

プログラムが実行されると、必要な初期処理が行われた後にmain関数が呼び出されます。

そのため、main関数はC言語プログラムの入口と考えられます。

プログラムを起動する
        ↓
main関数を開始する
        ↓
main関数内の処理を実行する
        ↓
main関数を終了する

int main(void)の意味

main関数の先頭は次のようになっています。

int main(void)

各部分の意味を確認しましょう。

記述意味
intmain関数が整数を返すことを表す
mainプログラムの入口となる関数名
voidこのmain関数が引数を受け取らないことを表す

intはintegerを短くした名前で、整数型を表します。

main関数は最後に整数を返します。この整数は、プログラムが正常に終了したかどうかを実行環境へ伝えるために使われます。

voidを記述する理由

mainの丸かっこ内にあるvoidは、このmain関数が引数を受け取らないことを明確に表します。

int main(void)

C言語では、引数を使用しない関数の丸かっこ内にvoidを記述できます。

コマンドライン引数を受け取るmain関数もありますが、今回のプログラムでは使用しません。

波かっこの役割

main関数の処理は、波かっこで囲みます。

{
    printf("Hello, World!\n");

    return 0;
}

開始する波かっこと終了する波かっこが対になっています。

{  処理の始まり
}  処理の終わり

波かっこの内側に、main関数で実行する処理を上から順番に記述します。

今回のmain関数では、次の順番で処理します。

  1. printfでHello, World!を表示する
  2. return 0でmain関数を終了する

インデントの役割

波かっこの内側にある処理は、行の先頭を少し下げて記述しています。

int main(void)
{
    printf("Hello, World!\n");

    return 0;
}

この行頭の空白をインデントと呼びます。

インデントは、どの処理がmain関数の内側にあるのか見やすくするために使います。

インデントがなくても文法上は動作する場合がありますが、プログラムの構造が分かりにくくなります。本コンテンツでは、半角スペース4個分のインデントを基本とします。

printfとは

printfは、書式付きで文字や数値を出力する標準ライブラリ関数です。

今回のプログラムでは、次のように使用しています。

printf("Hello, World!\n");

printfの丸かっこ内には、表示する文字列を指定します。

"Hello, World!\n"

文字列は、ダブルクォーテーションで囲みます。

部分意味
printf文字や数値を出力する関数
( )関数へ渡す内容を囲む
"Hello, World!\n"表示する文字列
;C言語の文の終わり

\nは改行を表す

文字列の最後にある\nは、改行を表す特殊な文字です。

printf("Hello, World!\n");

\nを付けると、Hello, World!を表示した後に、表示位置が次の行へ移ります。

Hello, World!
次の表示位置

\nは2文字に見えますが、プログラム内ではひとつの改行を表します。

先頭の記号は、円記号またはバックスラッシュとして表示されます。使用するフォントによって見え方が異なることがあります。

セミコロンの役割

C言語では、多くの文の終わりにセミコロンを付けます。

printf("Hello, World!\n");
return 0;

セミコロンは、ここまでがひとつの文であることを表します。

セミコロンを付け忘れると、コンパイラーが文の終わりを正しく判断できず、コンパイルエラーの原因になります。

return 0とは

main関数の最後には、次の記述があります。

return 0;

returnは、関数の処理を終了して値を呼び出し元へ返すために使用します。

main関数のreturn 0は、プログラムが正常に終了したことを実行環境へ伝えます。

0      正常終了
0以外  何らかの問題が発生したことを表すために使われる

今回のmain関数はint型の値を返すため、returnで整数の0を返しています。

プログラムの実行順序

hello.cの内容は、次のような順番で処理されるイメージです。

stdio.hの情報を利用できるようにする
        ↓
main関数を開始する
        ↓
printfでHello, World!を表示する
        ↓
return 0で正常終了する

ただし、#includeはプログラム実行中に処理される命令ではありません。コンパイル前の前処理で扱われます。

実際にプログラムを実行したとき、main関数内では次の順番で処理が進みます。

printf
   ↓
return 0

図3:hello.cの処理と保存状態

この図から分かること

hello.cは、C:\cgui\chap03へUTF-8で保存します。

プログラムはmain関数を中心に構成され、printfで文字を表示した後、return 0で正常終了します。この記事ではソースファイルの作成までを行い、コンパイルと実行は次の記事で行います。

プログラムの基本構造

今回のhello.cを役割ごとに分けると、次のようになります。

#include <stdio.h>          /* ヘッダファイル */

int main(void)              /* main関数 */
{
    printf("Hello, World!\n");  /* 実行する処理 */

    return 0;               /* 正常終了 */
}

上のコードは構造を説明するためにコメントを加えたものです。実際にhello.cへ保存するプログラムは、最初に示した次の内容を使用します。

保存するhello.cの完成内容

ファイル名:hello.c

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");

    return 0;
}

基本構造を表にすると、次のようになります。

構成要素役割
#include <stdio.h>printfを利用するための宣言を取り込む
int main(void)プログラムの入口となるmain関数を定義する
{ }main関数の処理範囲を表す
printfターミナルへ文字を表示する
\n表示後に改行する
;文の終わりを表す
return 0プログラムが正常に終了したことを伝える

空行を入れる理由

hello.cでは、stdio.hとmain関数の間、printfとreturn 0の間に空行があります。

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");

    return 0;
}

空行は、プログラムの機能には直接影響しません。関連する処理を見やすく分けるために使用します。

短いプログラムでは違いが小さく見えますが、プログラムが長くなると読みやすさに大きく影響します。

大文字と小文字を区別する

C言語では、大文字と小文字を区別します。

次の名前は、それぞれ異なるものとして扱われます。

main
Main
MAIN

printfもすべて小文字で記述します。

printf

次の記述はprintfとは異なる名前です。

Printf
PRINTf

ファイル名や関数名は、サンプルと同じ大文字、小文字で入力しましょう。

半角記号を使用する

C言語のソースコードでは、基本的に半角の記号を使用します。

使用する記号用途
#プリプロセッサ指令
< >標準ヘッダファイル名
( )関数の引数
{ }処理のまとまり
" "文字列
\エスケープシーケンス
;文の終わり

全角の丸かっこ、ダブルクォーテーション、セミコロンなどを使用すると、コンパイルエラーになります。

日本語入力が有効になっている場合は、ソースコードを入力するときに半角英数字入力へ切り替えておくと安心です。

実行結果の例

hello.cをコンパイルして実行すると、ターミナルには次のように表示されます。

Hello, World!

この記事では実行結果の完成イメージだけを確認します。実際にexeファイルを作成して実行する操作は、次の記事で行います。

保存後に確認する項目

hello.cを保存したら、次の項目を確認してください。

  • C:\cgui\chap03が存在する
  • Visual Studio Codeでchap03を開いている
  • hello.cがchap03の中にある
  • ファイル名がhello.cになっている
  • hello.c.txtになっていない
  • 文字コードがUTF-8になっている
  • #include <stdio.h>を記述している
  • main関数がある
  • printfの行末にセミコロンがある
  • return 0の行末にセミコロンがある
  • 開始と終了の波かっこが対応している
  • ダブルクォーテーションや丸かっこが半角になっている
  • Ctrl+Sで保存している

Visual Studio Codeでは、ファイルを変更してまだ保存していない場合、タブのファイル名付近に丸印が表示されることがあります。Ctrl+Sを押し、保存済みになっていることを確認しましょう。

ここまで確認できたら、最初のコンソールプログラムのソースファイルは完成です。次の記事では、MSYS2 UCRT64 BashからGCCを使用してhello.cをコンパイルし、作成されたhello.exeを実行します。