ぴぐノート

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

執筆者:

関連記事

C++のプリプロセッサの復習をしよう その2 【#defineの活用】

前回に引き続き、C++のプリプロセッサの復習です。 前回は#includeと#defineについて記事にしましたが、【まとめ】にも記載の通り、#defineと関連するプリプロセッサは多くあります。 今 …

【OpenCV】OpenCVを使ってみよう!表示・回転・拡縮・二値化

前回インストールを行ったOpenCVライブラリを使ってサンプルプログラムをいくつか作成してみましょう。 OpenCVはすごく有名な画像処理ライブラリなのでインターネットで探せばサンプルプログラムはたく …

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

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

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

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

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

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