注) 2004年7月
このページを書いた後に、C++に関しては、新しい情報のページを作りました。ぜひそちらもご覧になってください。そちらは、秀丸マクロを使っていて、『無料』と言うわけではありませんが・・・

第4章. C++

無料のC++コンパイラでは、【Borland C++ Compiler 5.5.1】が、使いやすいと思います。Cの章でも触れたように、日本語が扱えること、エラーメッセージも日本語で出ること、日本語のヘルプが付くことなどからです。++でないCのコンパイルも出来るので、これ一つあれば、LSI C-86なども用意しなくていいのです。

内容的にも、製品版であるBorland C++ BuilderからIDE部分を取り除いたもので、試用期間とかサイズの制限とか特に制限はありません。また、別途フリーでTurbo Debuggerも入手できるので、ソースレベルのデバッグも出来ます。

それから【Digital Mars】を紹介しておきます。こちらは標準でインラインアセンブルも出来ます。標準で出来上がるEXEのサイズも、BCCより小さくなるようです。

その他に、初心者がWindows環境に取り入れやすいGCCとして、【Dev-C++】を紹介します。

【Borland C++ Compiler 5.5.1】

【Borland C++ Compiler 5.5.1】の入手法

Borland JapanのBCCのページから、ダウンロードできます。

GUIフロントエンドソフトの入手

【Borland C++ Compiler 5.5.1】(通称BCC)は、通常では、初期設定(パスの設定&bcc32.cfg/ilink32.cfgの設定)をして、DOS窓から操作するのですが、のちのちの作業効率から考えて、GUIから操作可能にするソフトをインストールすることを、強くお勧めします。また、面倒な初期設定も自動的に行ってくれるため、つまらない設定ミスで【Borland C++ Compiler 5.5.1】が作動しないなどの不具合を防いでくれます。

お勧めのソフトは、次の2つです。お好きな方を選んでください。
1.CPad for Borland C++Compiler (通称BCPad) きときと(稀杜さんのサイト)
2.C言語を始めよう! AOK's Home Page(青倉克浩さんのサイト)

更に多機能で、プロジェクトで管理もできる【BCC Developer】などもありますが、最初は上記ソフトではじめて、技術が上がって不足を感じたら移行すれば良いと思います。

導入方法

稀杜さんのページに、「10分ではじめるBCC」という素晴らしい解説ページがあります。この通りに導入すればOKです。

ちなみに、【BCPad】は送金義務の無い1500円のシェアウェアです。稀杜さんのサイトに、このことに関する説明がありますが、カンパウェアに近い物のようです。無料で使い続けることに抵抗がある方は、【C言語を始めよう!】を選びましょう。こちらは完全無料です。インストールの方法も、自動的に初期設定ファイルを作ってくれる点も、ほぼ【BCPad】と同じです。

うまく設定できたか確認する

それでは、サンプルをコンパイルして、実行できるかやってみましょう。いつもコンソールプログラムだと飽きちゃうかもしれないので、メッセージウインドウを出して見ましょう。

#include <windows.h>

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    MessageBox(NULL,"メッセージ","タイトル",MB_OK);
    return 0;
}

フロントエンドソフトで上のサンプルを写して書いてみて下さい。第3章でも書きましたが、【BCPad】でも【C言語を始めよう!】でも、自動的にインデントして見やすいソースになります。1度名前を付けて保存して下さい。とりあえず mes.cpp にしておきましょう。BCCは拡張子を見て、CかC++かを判断します。Cのときは.c、 C++のときは.cpp です。今は.cppにしておかないとエラーになります。

コンパイルする前に、もうひとつやらなければならないことがあります。今回のサンプルは単純とはいえGUIプログラムなので、コンパイル時のオプションを設定しなければなりません。

【C言語を始めよう!】の場合はメニューの ビルド | Borland C++5.5の設定 で表示される窓で、「ターゲットはWindowsアプリケーション」にチェックを入れてください。

【BCPad】の場合は同じくメニューから、実行 | コンパイル時パラメータ で表示される窓で、コンパイル時パラメータのリストボックスに -W と書き込んでください。Wは大文字です。

これでいよいよ準備完了です。コンパイル・実行してください。

【C言語を始めよう!】の場合は、コンパイルと実行は別々の操作です。ツールバーを使うとラクでしょう。実行後、メッセージボックスが出れば成功です。

【BCPad】の場合は、右向き三角のツールバーをクリックすると、コンパイル・実行が連続でできます。ただしDOS窓が開きます。もちろん完成したmes.exeのアイコンを直接ダブルクリックしたときは、DOS窓は開かないので御安心を。

なお、Turbo Debuggerをインストールしてあれば、これらのソフトから簡単に呼び出せます。せっかくBorlandが無料でどうぞと言っているので、喜んでもらっておきましょう。ただし、ユーザー登録が必要です。

Borland C++ Compilerで作ったEXEって、サイズが大きいんだけど…。

上のサンプルでも、mes.exeは46KB程になリます。通常Cコンパイラに期待するよりも、ちょっと大きいですよね。別に明確な基準があるわけではないでしょうが…。最適化の-Oオプションを付けても変わらないんですよね。こんな簡単なソースでは効果が無いのでしょうか。

Visual C++だと、下位バージョンでは最適化機能が省略化されていたりするんですが、BCCだと、そう言うことでも無いようなんですが。

少しでも実行ファイルのサイズを小さくしたかったら、ここのページを参考に、noeh32.libとくっつけてコンパイルすると、15KB程小さくなるそうです。上のサンプルも、24.5KBになりました。

【Digital Mars】

【Digital Mars】はBCCに比べて、コンパイルが早い、生じるEXEが小さい、インラインアセンブラが出来るなどの特徴を持った、新鋭のコンパイラです。といっても、もともとはsymantecのコンパイラだそうで、歴史のあるものだそうです。

【Digital Mars】の入手法

DIGITAL MARSのサイトへ行って、ダウンロードのページからダウンロードできます。Digital Mars C/C++ Compilerの最新バージョンを落としてください。β版が公開されていて、β版でもいいから最新版が欲しい方は、それも落として上書きしてください。差分け分のみですのでβ版だけ落としてきても駄目です。そのほかではBasic Utilitiesもあった方が良いようです。Extended Utilities Packageもぜひとも欲しいのですが、残念ながら有料です。…が

Extended Utilities Packageは以前は無料だったらしいのです。ftp://ftp.digitalmars.com/Digital_Mars_C++/Patch/にアプローチすると、以前のバージョンなどの圧縮ファイルが多数見つかりますが、その中にdm812util.zipというファイルがあります。これが、その無料ファイルなのかもしれません。このファイルを解凍すると、現在のExtended Utilities Packageに含まれるファイルのうち、いくつかが手に入ります。

導入方法

落としてきたいくつかの圧縮ファイルを解凍します。すると、解凍後の各々のフォルダ構成が同じようになっていることがわかります。そこで、同名のフォルダのファイルを、骨格となるDigital Mars C/C++ Compiler由来のフォルダに1つにまとめます。(binならばbinに、libならlibに)  このとき、同名のファイルがあったら、日付の新しいほうが残るように気をつけて下さい。ちょっと説明がややこしいかもしれませんが、やってみればわかります。失敗したらやり直せば良いだけです。ここで幾ら失敗しても、レジストリやシステムを汚すことはありません。そして1つにまとまったら、先頭のフォルダ名をdmにして、ルートに近いところに丸ごと移動してください。(C:\dmとか) そして、binフォルダにパスを通してください。それで設定完了です。

【Digital Mars】は結構頻繁にアップデートしてますが、このやり方ならば、新しいバージョンが出たら、解凍して上書きすればいいだけですので簡単です。

うまく設定できたか確認する

それでは、サンプルをコンパイルして実行してみましょう。次のソースをエディタに貼り付けて、hello.cppとして保存して下さい。

#include <iostream.h>

int main()
{
    cout << "こんにちは" << endl;
    return 0;
}

いじくるつくーるの設定

次に、【いじくるつくーる】をインストールして、右クリックメニューの拡張で、「任意のファイルの1つ上のフォルダでMS-DOS(コマンド)プロンプトを開く」にチェックをつけます。この機能は、あらゆる言語開発で、きわめて役に立つので、【いじくるつくーる】を未導入の方は、ぜひともインストールして、設定しておいて下さい。

 エクスプローラで、hello.cppのアイコンを右クリックして、任意のファイルの1つ上のフォルダでMS-DOS(コマンド)プロンプトを開くを使ってDOS窓を開いてください。カレントディレクトリでDOS窓が開きます。そして dmc hello と打ってEnterです。hello.exeが出来たはずです。続けて hello と打ってEnter。「こんにちは」と表示されればOKです。

出来たhello.exeのサイズは43.5KB。【BCC】で同じ事をすると110KBでした。コンパイルに掛かった時間も短かかったと思います。

GUIプログラムでDOS窓が開くんだけど…

ところで、【Digital Mars】を使って、このページの最初のサンプル(メッセージボックスを表示するもの)をコンパイルすると、一緒にDOS窓も開きます。これでは不愉快というか、使い物になりません。

これを回避するには、コンパイルのときに dmc -L/SU:windows mes とオプションを付けてコンパイルします。Lは呼び出すlink.exeの設定。SU:windowsはWindowsアプリ用にリンクせよという意味です。これでDOS窓が開かなくなります。

フロントエンドソフトが欲しい!

CPad for LSI C-86やBCpadをインストールして、設定をいじって使えば、何とかなります。すでに他のコンパイラでこのソフトを使っていても、CPad for LSI C-86やBCpadを複数インストールすることで、使い分けできます。このソフトを使えば、OSレベルでパスを通しておくことは不要になります。

「C言語を始めよう」はレジストリの関係から、1つの環境に2つインストールできないので、すでにBCCなどで使っている場合には、この用途に使えません。

その他のものでは、ReloがDigital Mars対応を謳っています。

名前空間を使うとコンパイルできない

C++の参考書やネット上の講座によっては、新しいANSI規格に準拠した、以下のようなソースが書かれていることがあります。(というよりも、現在では、それが標準でしょう。) 1・2行目がさっきと違います。

#include <iostream>
using namespace std;

int main()
{
    cout << "こんにちは"<<endl;
    return 0;
}

これを【Digital Mars】でコンパイルすると、エラーでコンパイルできません。現在のところ、これをコンパイルできるようにするには、ダウンロードページにもあったSTLportを導入すれば良いそうです。ただし、これを導入すると、生成EXEのサイズが一挙に膨らむそうです。う〜ん、どうする?

【Dev-C++】

GNU C++ compiler で、Windows環境で使えるものが存在しますが、各種サイトでインストールや設定方法を読むと、ややこしそうで尻込みしたい気分になります。しかし、基本的に優れたコンパイラであることは間違いないでしょうし、GCCに沿った記述をしている参考書もあるので、GCCを使ってみたいという人もいるでしょう。

【Dev-C++】には、MinGWを同梱したパッケージがあり、コレをインストールするだけで、MinGW(Windowsで動くGCC)を、IDEから操作することが出来ます。むしろコンパイラとフロントエンドソフトが同時に準備できるという点からして、上の2つのコンパイラよりも導入がラクかもしれません。

【Dev-C++】の入手法

日本語版が配布されているので、そちらを入手しましょう。

DevC++-JPプロジェクトから、sourceforgeに行き、dev-cpp-x.x.x.x_setupJP.exeというファイルをダウンロードしてきます。(x.x.x.xはバージョン名)

導入方法

ダウンロードしたインストールファイルを、実行します。途中でコンポーネントの選択画面が出ますが、Fullのままで良いでしょう。また、現在のユーザーのみか全てのユーザーでインストールするかの選択もありますが、お好きな方にしてください。

実際に使ってみる

使う前の設定です。

  1. メニューのTools | Envilonment options | Interfaceタブ で、Japanese(日本語)にしてOKします。この操作後に日本語表示になります。
  2. メニューの ツール | 環境オプション | ファイルとディレクトリタブ で、デフォルトのディレクトリを指定します。私の場合はマイドキュメントに専用ディレクトリを作りました。プロジェクトなどの保存ダイアログを開いたときに、ここで指定したディレクトリが起点になります。
  3. メニューの ツール | 環境オプション | 関連付けタブ で、関連付けを指定します。インストールのときにc/cpp/hなどの拡張子が関連付けられてしまいます。私は、Dev-C++専用ファイル以外の拡張子の関連付けをはずしましたが、お好みでどうぞ。
  4. メニューの ツール | エディタオプション | 表示タブ で、MSゴシックなどの日本語表示に適したフォントに変更します。

それでは実際の使用例です。【Dev-C++】では、たとえ単一のファイルしか使わないプログラムでも、プロジェクトで管理する方が便利です。まず ファイル | 新規 | プロジェクト... または プロジェクト.. のツールバー で、新規プロジェクトを作成します。下のようなウインドウが開きます。

新規プロジェクト

コンソールプログラムの演習をしたいときには、Console Application のアイコンを選び、CかC++の希望する方をラジオボタンで選択しOKします。するとプロジェクトファイルの保存ダイアログボックスが開きます。使う前の設定で設定したフォルダが起点になっていると思います。このダイアログボックスを使って新しいサブフォルダを作り、その中に保存すると良いでしょう。プロジェクトごとにサブフォルダを作っておくと、整理が付いてあとから参照しやすくなります。保存後は次のような画面になります。

Dev-C++画面

OKすると、上の画像中のコードが既に自動的に書きこまれています。ここで8行目に cout<<"こんにちは"<<endl; の1行を挿入して、ツールバーのアイコンまたはF9キーでコンパイル&実行してみましょう。ソースファイルを未保存の場合はダイアログが開くので保存操作をしてください。コンパイル中は下のボックスが出ます。

コンパイル中の画面

コンパイルが終わると自動的にこの窓は閉じて、代わりにDOS窓が開きます。

こんにちは
続けるにはどれかキーを押してください . . .

上のように表示されればOKです。

最初にエディタに書かれているコードが邪魔なときは、全て消してしまって一から書き直してもかまいません。その場合でも、コンパイル時のオプションはコンソールプログラムに適した設定になっているので、十分このIDEを使う意味があるのです。新規プロジェクトで Empty Project を選んではじめてもOKですが、このときはプロジェクトのプロパティでコンソールプログラムであることを設定する必要があります。

DOS窓が一瞬出て、すぐ消えちゃうんだけど…

自分でコードを書き換えたときに、上の画面の8行目の system("PAUSE"); を消してしまうと、DOS窓がプログラム終了とともに消えてしまい、実行結果が把握できなくなります。【BCPad】などはIDE側で、消えないように上手く処理してくれますが、【Dev-C++】では、system("PAUSE");を残しておくことで対処しましょう。

system("PAUSE");を残すのがイヤだったり、Empty Project からプログラムの製作に入ってわざわざsystem("PAUSE");を挿入するのが面倒ならば、ツールメニューからコマンド(MS DOS)プロンプトを起動できるようにすると便利です。ツール | ツールの設定 | 追加 で次の図のように設定すれば、コンソールプログラムの動作確認がしやすくなります。作業ディレクトリ欄に「マクロの挿入」ボタンを使って<PROJECTPATH>を挿入することで、実行ファイルの存在するディレクトリをカレントディレクトリとしてプロンプトが開くように設定できます。あとは実行ファイル名(最初に保存したプロジェクトファイル名と同じ名前になります)を打ち込んでEnterキーを押せば、プログラムの挙動が確認できます。

生成されるEXEファイルが、チョ〜巨大サイズなんだけど・・・

上の例で私の環境で3.24MBにもなります。プロジェクトオプション | コンパイラタブ | リンカー で、「実行ファイルをStripする」をYesにすると213KBになります。今後すべてのプロジェクトで原則としてstripしたい場合は、メニューのコンパイラオプションで同様の設定をします。

ちなみに、下のWindows Application の例では、stripなし399KB、stripあり6.5KBでした。6.5KBというのはかなり小さいサイズです。

Windows Application

ところで、新規プロジェク作成画面のところで、Windows Application を選んだらどうなるのでしょう。その場合、下のようなコードが自動生成されます。初めて見た人はギョッとするでしょう。APIを呼び出して、窓を作るプログラムです。コンパイル・実行すると、何もないウインドウが表示されます。これを土台にしてGUIプログラムを作っていくわけです。

この分野をネット上で勉強したい人は、「猫でもわかるプログラミング」のSDK編が最も詳しいと思います。ただし「猫」は基本的にMS Visual C++に沿った記載だと思いますので、【Dev-C++】の場合、問題が出る場合があります。sけいし発のホームページたちさんで対応状況を調べたページがあります。

#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

勉強になるサイト

第3章と同じく、C++の初心者用サイトは数多くあります。Delphiと比べたら、書籍もサイトも100倍あるかもしれません。ですから、ちょっと探せば、必ずお気に入りのサイトが見つかるはずです。

それでも、やはり具体例を挙げておきます。C++といえば、やはりオブジェクト指向ということで、初心者にもわかりやすいクラスの使い方を解説している、小林健一郎氏のサイトを紹介します。プログラムを書こう!のページです。最近リニューアルされました。旧版にも良さがあると思うので、そちらもリンクしておきます。

また、Digital Marsを使ったインラインアセンブラを解説している「分かりやす〜いコンピュータ技術情報」の「簡単なアセンブラ言語」のページも、数少ないWindowsでのDigital Marsの解説ページとして紹介しておきます。


目次へ>  <前の章へ>  <次の章へ