我的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页面没有提供任何线索。
答案 0 :(得分:13)
根据OpenMP 2.0 C/C++ API specification(pdf)第2.4.1节,这是for
循环的限制之一。没有理由给它,但我怀疑它只是为了简化代码和编译器必须做出的假设,因为有特殊的代码来确保范围不会超出类型的最大值。
OpenMP 3.0显然也允许使用无符号类型,但我还没有看到它的实际效果。
答案 1 :(得分:2)
与Visual Studio 2013集成的Microsoft C / C ++编译器12.0仍然只支持OpenMP 2.5,并且不允许unsigned int
用于循环计数器。
GCC从版本4.4开始支持OpenMP 3.0,并允许unsigned int
用于循环计数器。