最終更新日時:
が更新

履歴 編集

Pragma演算子(C++11)

概要

C99互換として、Pragma演算子が導入された。

Pragma演算子は、マクロ内で処理系定義の機能を使用するための機能である。処理系定義の機能を使用するために、従来はPragmaディレクティブを使用してきたが、その機能はマクロ内では使用できない。

Pragma演算子は、_Pragma(文字列リテラル)の形式で、処理系定義の機能を文字列リテラルとして引数指定して使用する。

仕様

Pragma演算子は、単項演算子の形式で、以下の構文を持つ:

_Pragma (文字列リテラル)

これは、以下のように処理される:

  • 文字列リテラルのLプレフィックスを削除する
  • 前後のダブルクォーテーションを削除する
  • エスケープシーケンス\"をダブルクォーテーションに置換する
  • エスケープシーケンス\\をバックスラッシュひとつに置換する

処理結果のプリプロセッサトークンのシーケンスは、Pragmaディレクティブに指定した場合と同様に処理される。

#include <iostream>

// OpenMPの言語拡張を使用して、for文を並列実行する
#define OMP_PARALLEL_FOR _Pragma("omp parallel for")

// 以下のように、Pragmaディレクティブでは書けない
//#define OMP_PARALLEL_FOR #pragma omp parallel for

int main()
{
  constexpr int N = 5;
  int a[N] = {1, 2, 3, 4, 5};
  int b[N] = {1, 2, 3, 4, 5};
  int c[N] = {};

  // OMP_PARALLEL_FORは、 #pragma omp parallel for に展開される
  OMP_PARALLEL_FOR
  for (int i = 0; i < N; ++i) {
    c[i] = a[i] + b[i];
  }

  for (int i = 0; i < N; ++i) {
    std::cout << c[i] << std::endl;
  }
}

出力

2
4
6
8
10

参照