MSVC错误C3015(循环的OpenMP错误),但不是一个明显的错误

MSVC Error C3015 (bad OpenMP for loop) but not an obvious mistake

本文关键字:错误 一个 循环 C3015 OpenMP MSVC      更新时间:2024-09-23

我正在Visual Studio 2022中编译一些C++代码。我使用/std:c++17 /O2 /permissive- /openmp:llvm /MP /arch:AVX2作为编译器设置。我得到了编译器错误

C3015   initialization in OpenMP 'for' statement has improper form

然而,我觉得这可能是一个编译器错误(可能是/openmp:llvm(,因为我甚至无法使最简单的OpenMP for循环在这种情况下工作。for循环位于lambda内部,lambda是在位于头文件中命名空间(任何类或结构外部(的模板函数内部定义的。类似于:

namespace Foo {
template <typename Func>
void f(Func work, const int beta, bool check = false) {
auto mylambda = [](std::vector<double>& y, double a) {
#pragma omp parallel for
for (int test = 0; test < 0; test++)
printf("Hello C3015n");
};
work();
}
}

我在过去尝试使用长(有符号/无符号(循环变量时见过C3015,但事实并非如此。此外,确切的代码在gcc下编译得很好,所以这是MSVC行为的特定部分。在这个头文件中(在其他函数等中(还有其他OpenMP for循环不会引发这个错误。

我只是想知道我是否犯了一些使用错误,或者是否有一些变通方法。或者,如果这是一个不可避免的编译器错误,至少如何报告这样的事情并修复它。

正如@Jerry Coffin在评论中所建议的,这是一个编译器错误,是x64 msvc 19.31和19.32之间的回归。事实证明,这个错误已经报告给了微软,并且有一个修复程序正在等待发布(我想在下一个小的MSVC更新中(。

相关文章: