ぴぐノート

Good code is its own best documentation.

C/C++ プログラミング言語 雑記

C++のプリプロセッサの復習をしよう その1

投稿日:

C++を勉強していた時期から苦手だったのがプリプロセッサでした。
インクルートガードに#ifndefやら#defineやら#pragma onceやら…。

C++に限った話ではありませんが、書籍などでは紙面の関係上ソースファイルを大きく分けたりしないためかプリプロセッサの説明などが不十分であるような気もします。

そんな状況の中でも既存のソースコードなどを見ると#if definedや#pragmaが頻繁に登場して本当に辟易することがあります。

今回は復習も兼ねて順番に確認し直そうと思います。

#include

#includeプリプロセッサ・ディレクティブはマクロやクラス定義などが記述されたヘッダーファイルを読み込みます。

上記の構文はどちらも正しいですが、山かっこ形式と引用符形式では囲まれたヘッダーファイルをどの順番で探し出すかが異なります。
基本的にはコンパイラをインストールした際に付属するヘッダーファイルを検索する場合は山かっこ形式を、コンパイルするソースファイルがあるディレクトリにあるヘッダーファイルを検索する場合は引用符形式で指定します。

ざっくり言えば、iostreamなど標準のヘッダーファイルであれば<>(山かっこ形式)を、それ以外のものは””(引用符形式)で指定すれば大体は問題ありません。

#define

#defineディレクティブは本当に利用の幅が広いです。
基本的にはマクロの定義を行うプリプロセッサとなります。

上記のように記載されていれば、コンパイラが「VERSIONと記述された箇所を3.14に置換」します。
つまり、

と記述されれば、VERSIONが3.14に置換され、double型変数piは3.14で初期化されます。

関数形式マクロ

上記のような使い方以外にも#defineの置換はさまざまな場面で利用されます。

プリプロセッサにより、MAX(1, 2)は以下のように置換されます。

結果、コンソールには[ 2 ]と表示されます。

まとめ

この辺りはまだ簡単に思えますが、#defineが曲者です。
#ifdef, #ifndef, #if defined, #if ! defined, #undef, #演算子, ##演算子と羅列したプリプロセッサは全て#defineと関連してきます。

上手く使えればデバッグ作業やコメントアウトなどに非常に便利ですが、便利すぎていろいろなところで出てくるのでしっかり復習していきます!

スポンサーリンク

スポンサーリンク

-C/C++, プログラミング言語, 雑記

執筆者:

関連記事

【MFC入門】メッセージボックスにエラーコードを表示させよう

ライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。 GetLastError関数(最新のエラーコードを取得する関数)がライブラリに含まれていることもありますが、そうでない …

【Boost】オープンソースライブラリBoostをインストールしよう

普段からC++でのプログラムを作成していてBoost(ブースト)を知らないという人はあまり多くないかもしれませんが、「実はまだ使ったことない…」という人もいるのではないでしょうか? ライブ …

【MFC】マルチスレッドでプログレスバーを実装しよう その3

プログレスバーをマルチスレッドを用いた実装について最後の記事です。 引き続き作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分か …

DLLファイルに含まれる関数の調べ方

何かプロジェクトを作成しようとするさいに、インターネットで同じような機能をもったツールを検索するということは当たり前に行われていると思います。 そう簡単に見つかることは多くありませんが、オープンソース …

C++でインターフェイスを作成しよう。

私事ですが今後業務ではC++を使用することになりそうです。 今まではウェブ関連の業務であったり、ちょっとしたテスト程度だったのでJavaを中心に使っていたため、C++の文法など少し忘れ気味です&#82 …