C応用5 プリプロセッサ文
C応用5 プリプロセッサ文
1桁目に#を書くとプリプロセッサ文になります。コンパイルは、機械語に翻訳しますが、このコンパイル前に行われるのがプロプロセスという作業になります。
プリプロセッサ文は、プリプロセスの時に行う命令文になります。今までのプログラムで「#include」という記述をしてきましたが、この「#include」もプリプロセッサ文の一つです。
本章では、プリプロセッサ文の中の、マクロ定義と呼ばれる「#define」について説明します。一番使われるプリプロセッサ文で、マクロ関数と呼ばれる、関数ではありませんが、関数の様な使い方をするものも作れます。
「#define」はマクロ定義と言い、プリプロセッサ文の中の一つです。「#define」は、文字の並び(置換文字列)にマクロ名と呼ばれる名前を付ける命令で、コンパイル前のプリプロセスと呼ばれる作業の過程で、マクロ名部分が置換文字列に置換されます。単純な置換になるため、置換文字列を書く書き方に工夫が必要になります。
「#define」で、マクロ関数を作る事もできます。
「#define」を書く時の注意点やマクロ関数の書き方、使い方を説明しています。
・プリプロセッサ、コンパイラ、リンカでビルドされる
ビルドすることでプログラムの実行ファイルを作成、プログラムを実行することができます。ビルドは、プリプロセッサ、コンパイラ、リンカという3つのアプリから構成されています。
・#から始まる文はプリプロセッサ文
プリプロセッサ文は、プリプロセッサが解釈する文で、文ですが、「;」は書きません。
1文字目に、必ず「#」を書きます。
・置き換え文字列に演算子がある時は( )で囲う
置き換え文字列中に演算子がある場合は、演算子を含む式の形を維持させるため、( )で囲うようにします。( )で囲わないと、間違った解釈をされる危険があります。
・マクロ関数の引数は( )で囲う
マクロ定義で、マクロ名の後に( )を付けるとマクロ関数を作ることができます。( )の中に、引数を書きますが、置き換え文字列に引数を書く時、引数を( )で囲うようにします。( )で囲わないと、間違った解釈をされる危険があります。
練習問題35で、バトルゲームは完成させましたが、テキストだけの表示で、少し分かり難いです。
以下の練習問題36から練習問題40では、アスキーアートやバルーンメッセージを追加し、見栄えをよくします。
練習問題25の時に用意したテキストファイルとファイル入力関数を使って、バトルゲームのキャラクタを画面に表示します。画面に表示する時は、左キャラクタの表示の起点は左下位置、右キャラクタの表示の起点は右下位置になるように、表示位置を調整します。
練習問題36のプログラムで、左キャラが攻撃しているアスキーアートを表示している時に、メニューを表示し、上下の方向キーでカーソル移動できる様にします。また、メニューは、バトルゲームで使用する2種類のメニューを表示します。
練習問題37のプログラムに、バトルの様子をメッセージ表示する処理を追加します。バルーンメッセージと呼ばれる、四角い枠の中にメッセージを表示する関数を用意しているので、この関数を使ってメッセージを表示します。
練習問題38のプログラムに、プレイヤーと対戦相手のステータスを表示する処理を追加します。また、プレイヤーと対戦相手の現状のHPとMPも表示します。HPとMPの値は、バトルする中で、負数になる可能性があるので、負数になった場合は、0を表示する様にします。
練習問題35で作成したバトルゲームに、練習問題36~39で作成したアスキーアート表示、メニュー選択、バルーンメッセージ、枠付きのステータス表示のプログラムを追加して、アスキーアートを表示するバトルゲームを完成させます。
上記で説明した練習問題と同じ問題です。
下記のYoutubeの動画の説明の所にはダウンロードのURLが記載されいます。
main.cppというソースファイルを含むVisual Studio 2022のプロジェクトファイル一式がダウンロードできます。ソースファイルは未完成の状態です。ソリューションファイルからVisual Studioを立ち上げ、プログラムを完成させてください。
《練習問題36》
マクロ関数(バトルゲームのAA表示)
《練習問題37》
マクロ関数(メニュー表示と選択)
《練習問題38》
バルーンメッセージ
《練習問題39》
枠付きのステータス表示
《練習問題40》
バトルゲーム(AA表示のゲーム完成)
マクロ関数を定義する時の注意点として、複文になる場合は、do while(0)で囲うというものがあります。これについて説明します。
マクロ定義の注意点は、「5.1 マクロ定義とマクロ関数」で説明していましたが、複文になる場合の技を使っていなかったので、書き方によってはエラーになる場合があります。do while(0)を使わないとどの様なエラーになるのか、その対処方法についても説明します。
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答