ぴぐノート

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++, プログラミング言語, 雑記

執筆者:

関連記事

Eclipse NeonとCDT/MinGWでC++開発環境を作成しよう!(2)

前回の記事でEclipseにCDTを追加インストールすることができました。 今回はMinGWとMSYSをインストールし、Eclipse上でC++プロジェクトを実行してみましょう。 この際に必要なダウン …

第2新卒やフリーターが未経験からプログラマになるには無料のITスクール!

私が働いている会社でもちょくちょく面接希望の電話がかかってきます。 業界全体として人手不足と言われるコンピューター業界なので、未経験であっても学習意欲が感じられたり何か自分で物づくりを経験していれば、 …

ポイント(pt)からピクセル(px)への変換:DPIについて

写真などの画像ファイルやPDFなどの文書ファイルを扱う際に知っておくこととして、ポイントとピクセル、そしてDPI(Dot Per Inch:1インチあたりのドット数)があります。 ライブラリなどを使う …

【C++11】後処理が必要なリソースはスマートポインタを使おう

オープンソースのライブラリのソースコードを呼んでいるとC++11で追加されたunique_ptrを使用しているところもちらほらと見られるようになってきています。 MFCなどを利用していれば動的確保した …

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

昨日に続き、プログレスバーをマルチスレッドを用いて実装してみましょう。 作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分かるこ …