ぴぐノート

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

執筆者:

関連記事

【2016年福袋】ヨドバシカメラ 2016年夢のお年玉箱の中身は?

2017年のヨドバシカメラ 夢のお年玉箱はヨドバシカメラ公式のショッピングアプリで”のみ”予約ができると発表されましたね。 ヨドバシカメラの夢のお年玉箱は、例年とても混雑するこ …

整備済みiPhone 6sが米Apple storeで販売開始。

米Appleの公式オンラインショップ、Apple storeで整備済iPhoneの取り扱いを開始しました。 全てSIMロックフリーモデル、バッテリーは新品の状態で価格は新品よりも15%OFFとなり約1 …

【Boost】boost::property_treeの例外処理を考えよう!

ライブラリなどを使用していると、「使い方は大体分かった!使ってみよう!」とすると微妙にはまってしまうことがあります。 前回・前々回でお話しした文字コードもその一つですが今回は例外処理について考えてみま …

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

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

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

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