Oracle® Developer Studio 12.5: C++ ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

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

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

2.5.1 プラグマ

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

Oracle Developer 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 事前に定義されている名前

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

2.5.4 警告とエラー

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

#error token-string

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

#warning token-string

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