プリプロセッサ

プリプロセッサ ディレクティブ (Preprocessor Directives)

   
#define  
#undef  
#error  
#import  
#elif  
#if  
#include  
#using  
#else  
#ifdef  
#line  
#endif  
#ifndef  
#pragma  
プリプロセッサ ディレクティブ | MSDN

#define

コンパイラに対し、識別子をトークン文字列に置き換えるように指示するマクロを作成できます。

#define identifier token-stringopt
#define identifier ( identifieropt, ..., identifieropt ) token-stringopt
#define ディレクティブ (C/C++) | MSDN

識別子を定義するだけならば、token-stringoptを省略します。Visual Studioではこれを、プロジェクトのプロパティの[C/C++] → [プリプロセッサ] → [プリプロセッサの定義]で設定できます。

マクロ (Macros)

コンパイルの前に、定めたパターンで文字を置換できます。

たとえば、

#define AAA 10

のようにマクロが定義されていると、

i = AAA

の記述はプリプロセッサにより、

i = 10

として展開されます。また引数を取るように

#define BBB(x,y) x<y

と定義されていると、

BBB(10,20)

の記述は、

10<20

として展開されます。

参考
参考書

#undef

定義されている識別子を削除できます。

#undef identifier
#undef ディレクティブ (C/C++) | MSDN

#if

#if constant-expression
    //
#elif constant-expression
    //
#else
    //
#endif
#if、#elif、#else、および #endif ディレクティブ (C/C++) | MSDN

constant-expressionには次の式を指定できます。

  • 整数定数の式 (整数のすべての範囲を表現できるとは限らない)
  • 文字定数の式
  • defined演算子 … defined( identifier ) (かっこは省略可能)

#ifdef

#ifdef#if definedの短縮形であり、

#ifdef identifier

と記述することは、

#if defined identifier

と同義です。これは互換性のために用意されているディレクティブであり、必要がなければ#if definedとすべきです。#ifdef および #ifndef ディレクティブ (C/C++) | MSDN

たとえばVisual C++のビルド オプションで/D "_DEBUG"と指定されているとき、このディレクティブにより次のように分岐できます。

#ifdef _DEBUG
    // デバッグ ビルド
#else
    // リリース ビルド
#endif

#ifndef

#ifndef identifier

は、

#if !defined identifier

と同義です。

#pragma

コンピュータまたはOS固有の機能を指定できます。

#pragma token-string( parameters )
Pragma Directives and the __Pragma Keyword | Microsoft Learn

Microsoft CとC++コンパイラでは、token-stringに下表の文字列を指定できます。

alloc_text auto_inline bss_seg
check_stack code_seg comment
component conform ※1 const_seg
data_seg deprecated detect_mismatch
fenv_access float_control fp_contract
function hdrstop include_alias
init_seg ※1 inline_depth inline_recursion
intrinsic loop ※1 make_public
managed message  
omp once  
optimize pack pointers_to_members ※1
pop_macro push_macro region, endregion
runtime_checks section setlocale
strict_gs_check unmanaged vtordisp ※1
warning    
※1 C++コンパイラでのみサポートされる

comment

オブジェクト ファイルまたは実行ファイルに、コメント記録を配置できます。

#pragma comment( comment-type [,"commentstring"] )
Syntax - comment (C/C++) | Microsoft Learn

comment-typeには、下表の事前定義された識別子を指定します。

識別子 配置される情報
compiler コンパイラの名前とバージョン番号
exestr 文字列
lib ライブラリの検索
linker リンカーオプション
user 文字列

たとえば次のように記述すると、リンク時にリンカーがsample.libを探すようになります。

#pragma comment( lib, "sample" )

これはVisual C++では、リンカーの設定で[追加の依存ファイル]を指定するのと同じです。

warning

警告メッセージを制御できます。

// 警告メッセージの4507と4034を無効にする (Disable warning messages 4507 and 4034.)
#pragma warning( disable : 4507 34 )

// 警告メッセージの4507の警告のふるまいを、既定に戻す。既定で無効ならば、有効にする
#pragma warning( default : 4507)


// 警告の4385を、一度だけ表示する (Issue  warning 4385 only once.)
#pragma warning( once : 4385 )

// 警告の4164を、エラーとして報告する (Report warning 4164 as an error.)
#pragma warning( error : 164 )
warning | MSDN

#import

#import "filename" [ attributes ]
The #import Directive | MSDN

attributesには、#import の属性 (C++)を指定できます。

参考

参考書

  • プログラミング言語C++ 第3版 [アジソン・ウェスレイ・パブリッシャーズ・ジャパン] Bjarne Stroustrup
    付録A 10.1「プリプロセッサディレクティブ」

プリプロセッサ演算子 (Preprocessor Operators)

演算子 動作
文字列化演算子 (#) 対応する実引数が、二重引用符で囲まれる
文字定数化演算子 (#@) 対応する引数が単一引用符で囲まれ、文字として処理される (Microsoft 固有の仕様)
トークン連結演算子 (##) 実引数として使用されるトークンが、他のトークンを形成するために連結されることを許可する
defined演算子 特定のマクロ ディレクティブで、複合式の記述を簡略化する
プリプロセッサ演算子 | MSDN
Microsoft Learnから検索