Oracle Solaris Studio 12.2: C++ ユーザーズガイド

2.5 指示および名前の前処理

この節では、C++ コンパイラ特有の前処理の指示について説明します。

2.5.1 プラグマ

プリプロセッサ指令 pragma は C++ 標準の一部ですが、書式、内容、および意味はコンパイラごとに異なります。C++ コンパイラが認識するプラグマ (指令) の詳細は、付録 B プラグマを参照してください。

Solaris Studio C++ は、C99 のキーワードである _Pragma もサポートしています。次の 2 つの呼び出しは同等です。


#pragma dumpmacros(defs)     
_Pragma("dumpmacros(defs)") 

#pragma の代わりに _Pragma を使用するには、プラグマテキストをリテラル文字列として記述し、_Pragma キーワードの 1 つの引数として括弧で囲みます。

2.5.2 可変数の引数をとるマクロ

C++ コンパイラでは次の書式の #define プリプロセッサの指示を受け入れます。


#define identifier (...) replacement_list
#define identifier (identifier_list, ...) replacement_list

マクロパラメータリストの終わりが省略符号である場合、マクロパラメータより多くの引数をマクロの呼び出しで使用できます。追加の引数は、マクロ交換リストにおいて __VA_ARGS__ という名前で参照できる、コンマを含んだ単一文字列にまとめられます。次の例は、変更可能な引数リストマクロの使い方を示しています。


#define debug(...) fprintf(stderr, __VA_ARGS__)
#define showlist(...) puts(#__VA_ARGS__)
#define report(test, ...) ((test)?puts(#test):\
                        printf(__VA_ARGS__))
debug(“Flag”);
debug(“X = %d\n”,x);
showlist(The first, second, and third items.);
report(x>y, “x is %d but y is %d”, x, y);

この結果は、次のようになります。


fprintf(stderr, “Flag”);
fprintf(stderr, “X = %d\n”, x);
puts(“The first, second, and third items.”);
((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y));

2.5.3 事前に定義されている名前

付録の 「A.2.8 -Dname[ =def]」 は、事前に定義されているマクロを示しています。これらの値は、#ifdef のようなプリプロセッサに対する条件式の中で使用できます。+p オプションを指定すると、sununixsparc、および i386 の事前定義マクロは自動的に定義されません。

2.5.4 警告とエラー

#error および #warning プリプロセッサディレクティブを使用すると、コンパイル時の診断を生成できます。

#error token-string

エラー診断 token-string を発行して、コンパイルを終了します。

#warning token-string

警告診断 token-string を発行してコンパイルを続行します。