C++ c++;omp原子捕获-语法?

C++ c++;omp原子捕获-语法?,c++,openmp,C++,Openmp,非常简单的代码,看不出为什么编译器在使用omp原子捕获时抛出错误 //我的班级 class my_class { my_class() { } static int class_int; static int get_next_int(); }; //my_class.cpp int my_class::get_next_int() { int next_int; #pragma omp atomic capture next_int = class_int++; r

非常简单的代码,看不出为什么编译器在使用
omp原子捕获时抛出错误

//我的班级

class my_class
{

my_class()
{ }

static int class_int;
static int get_next_int();

};
//my_class.cpp

int my_class::get_next_int()
{
   int next_int;
  #pragma omp atomic capture
  next_int = class_int++;

  return next_int;
}
编译器错误:

my_class.cpp: In static member function 'static int 
my_class::get_next_int()':

my_class.cpp:2069: error: expected end of line before 'capture'
my_class.cpp:2070: error: invalid operator for '#pragma omp atomic' before '=' token
它可能与
静态
有关吗?我无法想象为什么

如果我改用
pragma omp critical
,那么它工作正常(没有编译器错误)


PS I have
#将
包含在所有.h和.cpp中。我会像往常一样链接到
-fopenmp
,如果您使用的是Microsoft编译器,它不支持
omp-atomic
指令


将代码更改为just
#pragma omp atomic
,根据ms文档,编译器将做正确的事情。使我怀疑。:)

OpenMP 3.1中引入了
capture
子句。您需要一个兼容的编译器:

  • 自v4.7以来的GCC
  • 自v10.1以来的英特尔编译器
  • 自v12.3以来的Oracle Solaris Studio
  • 除了
  • MSVC(所有版本,包括2012),不支持高于2.0的OpenMP版本

GCC 4.4.5不支持OpenMP 3.1。它只支持OpenMP 3.0。

@CycoMatto:您的gcc是否支持capture子句?我在4.8ish gcc变更日志中看到了它。我这里没有Linux机器可以检查了…:)哇!我想我应该检查一下显而易见的事实。显然,我认为
capture
足够基本,编译器/版本无关紧要。