第2回
Cプログラミングのお膳立て

VC++ Exp.のお作法(2)~テンプレートの意味

次に、ウィザードで生成されたコンソールアプリケーションのテンプレートについて説明しておきます。

2種類のコメント記号

まず、コメント記号について説明しておきましょう。ご存じのようにコメントとは、処理系によって機械語に変換されることのない──CPUに対する命令とは見なされない──ソースコードです。人間がソースコードの意味を把握しやすいよう、人間のために記述される注釈文です。

Cのコメントは/*~*/で囲んで記述します。間に改行が入っても構いません。そのため、複数行にわたるコメントを一気に書くこともできます。

C++では、コメント行の先頭に//記号を記述し、そこかから行末(改行)までをコメントとする1行コメントとなります。リスト1の先頭2行はC++形式のコメントです。

C++はCの拡張版ですから、Cの/*~*/形式のコメントも通用します。また、ここで紹介しているようにC++の処理系でCのソースを扱う場合、Cのソース内に//形式のC++のコメント記号を使うこともできます。

しかし、両方を混在させるとソースコードがCなのかC++なのか判別しにくくなるため、このコラムではC形式のコメント記号(/*~*/)を主に使うことにします。但し、リスト1のようにウィザードが生成したテンプレートに予め記述されているコメント記号は、修正しないでそのまま残します。

プリプロセッサ指令

Cのソースの基本事項を簡単に紹介していきましょう。

リスト1を見ると、コメント行の次に
#include "stdafx.h"
という1行が見つかります。“#include”のように#記号で始まる命令はコンパイラに渡されるCの命令ではなく、その前の段階でソースコードを処理するプリプロセッサへの命令で、一般に「プリプロセッサ指令」(または「プリプロセッサ・ディレクティブ」)と呼んでいます。

Cでは、プリプロセッサがまずソースコードを読み込んで処理し、それがコンパイラに渡されて中間言語へと変換されます。詳しくは、回を追って紹介しましょう。ここでは、“#include”プリプロセッサ指令についてのみ説明しておきます。

“#include”指令は、続くファイル名で示したファイルの中身を“#include ~”と記述された位置に読み込みます。この処理を「(ファイルを)取り込む」と表現します。ここでは“stdafx.h”というファイルを取り込んでいます。ソースをコンパイルする前に必要な様々な定義などが記述されたヘッダファイルです。

取り込まれたヘッダファイルは、#include指令以降に記述されたソースコードと共にコンパイルされます。

標準入出力とヘッダファイル

さて、コンソールモードのC言語をご存じの方なら、ここで本来なら
#include <stdio.h>
として“stdio.h”を取り込むべきなのではないか? と、疑問を抱くはずです。stdio.hの“stdio”とは“Standard Input/Output”の略で、標準入出力を制御するために必要な基本的な関数、記号定数、マクロなどの定義が記述されたヘッダファイルです。

コンソールモードでは、キーボードを標準入力、ディスプレイ(キャラクタ端末)を標準出力とし、標準入力から得たデータを処理してその結果をディスプレイに表示する──という形が基本となっています。

Visual C++では、コンソールモードの画面もWindowsの制御下に置かれるため、単純に

キーボード→プログラム→ディスプレイ

という形で処理されるわけではありません。スタートメニューの「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」で起動するDOSのウィンドウは、WindowsというOSを介した擬似的なエミュレーション環境となります。そのために必要な各種定義が、stdafx.hに記述されています。そしてその中では“#include <stdio.h>”と記述されており、結果的にstdio.hが取り込まれます。

外枠が違っても本質は同じ

Visual C++を使う場合、このあたりのお膳立てがいわゆる『素の状態のC』とは異なります。回を追ってプログラミングの本質的なところに迫っていくときには、WindowsというOSやVisual Studioという統合開発環境が覆い隠している部分を覗き見る必要が生じます。但し、最初の段階ではあまり意識する必要はありません。

とりあえず今の段階では、以下の★マークの箇所に処理の本質部分のソースコードを記述する──ということを覚えておきましょう。

・Visual C++のテンプレート
int _tmain(int argc, _TCHAR* argv[])

{

★ -------------------------ここにソースコードを記述する

return 0;

}
本来のCのソースの書き方では、以下のようになります。

・一般的なCのソース
#include <stdio.h>

int main(int argv, char *argv[])

{

★ -------------------------ここにソースコードを記述する

return (0);

}

return命令

return命令では、プログラムの終了コードを1バイトの整数で示します。終了コードは、プログラムを呼び出したプログラム(コンソールモードでは一般にシェル)に対して、実行結果を知らせるために用いられます。

通常は0としておいて構いませんが、プログラムの仕様によっては様々な値を返すことになります(一般には正常終了時に0、エラー終了時に−1を返します)。

returnの後ろの値を()で囲むかどうか、returnと(との間にスペースやタブを挿入するか、それともくっつけるか……などの書き方については、厳密な決まりはありません。プログラマーの好み、というとアバウトな表現ですが、慣習などによってそれぞれ独自の書き方をして構いません。

僕の場合は、返す値を分かりやすくするために()で囲み、関数の引数と紛らわしくならないようnと(の間にスペースを1つ挿入しています。