ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C++ ユーザーズガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
この節では、C++ コンパイラ特有の前処理の指示について説明します。
プリプロセッサ指令 pragma は C++ 標準の一部ですが、書式、内容、および意味はコンパイラごとに異なります。C++ コンパイラが認識するプラグマ (指令) の詳細は、付録 B プラグマを参照してください。
Oracle Solaris Studio C++ は、C99 のキーワードである _Pragma もサポートしています。次の 2 つの呼び出しは同等です。
#pragma dumpmacros(defs) _Pragma("dumpmacros(defs)")
#pragma の代わりに _Pragma を使用するには、プラグマテキストをリテラル文字列として記述し、_Pragma キーワードの 1 つの引数として括弧で囲みます。
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));
付録の 「A.2.8 -Dname[ =def]」 は、事前に定義されているマクロを示しています。これらの値は、#ifdef のようなプリプロセッサに対する条件式の中で使用できます。+p オプションを指定すると、sun、unix、sparc、および i386 の事前定義マクロは自動的に定義されません。
#error および #warning プリプロセッサディレクティブを使用すると、コンパイル時の診断を生成できます。
警告診断 token-string を発行してコンパイルを続行します。