22

我的 C++/OpenMP 代码中有一个循环,如下所示:

#pragma omp parallel for
for(unsigned int i=0; i<count; i++)
{
    // do stuff
}

当我编译它(使用 Visual Studio 2005)时,我收到以下错误:

error C3016: 'i' : index variable in OpenMP 'for' statement must have signed integral type

我了解发生错误是因为i未签名而不是已签名,并且更改i为已签名删除了此错误。我想知道为什么这是一个错误?为什么不允许无符号索引变量?查看此错误的MSDN页面没有给我任何线索。

4

2 回答 2

16

根据OpenMP 2.0 C/C++ API 规范for(pdf),第 2.4.1 节,这是循环的限制之一。没有给出任何理由,但我怀疑这只是为了简化代码和编译器必须做出的假设,因为有特殊代码可以确保范围不会溢出类型的最大值。

OpenMP 3.0 显然也允许无符号类型,但我还没有看到它在起作用。

于 2010-05-12T19:21:52.163 回答
3

与 Visual Studio 2013 集成的 Microsoft C/C++ Compiler 12.0 仍然仅支持 OpenMP 2.5,并且不允许unsigned int循环计数器。

GCC 从 4.4 版开始支持 OpenMP 3.0,并允许unsigned int循环计数器。

于 2013-07-22T08:54:50.480 回答