C++ 叮当声10&;基于范围的OpenMP错误(文档说应该可以)

C++ 叮当声10&;基于范围的OpenMP错误(文档说应该可以),c++,c++17,openmp,clang++,C++,C++17,Openmp,Clang++,我正在c++17&OpenMP项目上测试clang 10.0,在基于范围的for上使用#pragma omp parallel for时出现错误 clang 10的发行说明在本节中非常清楚地说: 增加了对基于范围的循环的支持 当我使用clang++-10-fopenmp-std=c++17编译MWE时(请参阅联机编译器): #包括 #包括 int main(int argc,字符**argv){ std::载体ii{0,11,22,33,44,55,66}; #pragma-omp并行 用于

我正在c++17&OpenMP项目上测试clang 10.0,在基于范围的for上使用
#pragma omp parallel for
时出现错误

clang 10的发行说明在本节中非常清楚地说:

  • 增加了对基于范围的循环的支持
当我使用
clang++-10-fopenmp-std=c++17编译MWE时(请参阅联机编译器):

#包括
#包括
int main(int argc,字符**argv){
std::载体ii{0,11,22,33,44,55,66};
#pragma-omp并行
用于(内部和一级:二级){

OpenMP 5.0中添加了对基于范围的for循环的支持,正如您链接到的中所述,您需要显式使用
-fopenmp version=50
选项来激活对它的支持:

在叮当声中支持OpenMP 使用
-fopenmp version=50
选项激活对OpenMP 5.0的支持

因此,如果我们将编译命令扩展到
clang++-10-fopenmp-fopenmp version=50-std=c++17
,OMP pragma将接受它后面基于范围的for循环


.OpenMP 5.0中添加了对基于范围的for循环的支持,并且,正如您链接到的中所述,您需要明确使用
-fopenmp version=50
选项来激活对它的支持:

在叮当声中支持OpenMP 使用
-fopenmp version=50
选项激活对OpenMP 5.0的支持

因此,如果我们将编译命令扩展到
clang++-10-fopenmp-fopenmp version=50-std=c++17
,OMP pragma将接受它后面基于范围的for循环


.

看起来您没有使用OpenMP 5.0(即使您使用的是支持其新功能的clang版本)。您是否尝试过明确选择OpenMP 5.0(其中添加了对基于范围的for循环的支持)?
clang++-10-fopenmp-fopenmp version=50-std=c++17
@dfri-Yup,有效:看起来您没有使用OpenMP 5.0(即使您使用的是支持其新功能的clang版本)。您是否尝试过显式选择OpenMP 5.0(其中添加了对基于范围的for循环的支持)?
clang++-10-fopenmp-fopenmp version=50-std=c++17
@dfri-Yup,有效:非常感谢。我习惯于不需要OpenMP版本规范的gcc。AFAIK正式支持OpenMP 4.5,但无错误地采用基于范围的并行循环。非常感谢。我习惯于不需要OpenMP版本规范的gcc。aFAIK it正式支持OpenMP 4.5,但采用基于范围的并行循环,没有错误。
#include<vector>
#include<iostream>
int main(int argc, char** argv){
    std::vector<int> ii{0,11,22,33,44,55,66};
    #pragma omp parallel for
    for(int& i: ii){
        std::cerr<<i<<std::endl;
    }
}
<source>:6:5: error: statement after '#pragma omp parallel for' must be a for loop

    for(int& i: ii){

    ^

1 error generated.

Compiler returned: 1