英特尔C ++编译时非const参数作为常量参数[重复]通过警告167(Intel C++ Comp

2019-08-17 00:19发布

这个问题已经在这里有一个答案:

  • 为什么是不是合法的转换“指针指向非const”的“指针指向const的” 5个回答

我有一个大的代码库,最近从微软的编译器的英特尔C ++编译移动。 我们团队的目标是没有主线警告编译。 由于开关,警告167的一个实例已经困惑了我。 如果我编译下面的代码:

int foo(const int pp_stuff[2][2])
{
   return 0;
}

int foo2(const int pp_stuff[][2])
{
    return 0;
}


int main(void)
{
    int stuff[2][2] = {{1,2},{3,4}};

    foo(stuff);
    foo2(stuff);

    return 0;
}

国际刑事法院会给我警告:

1>main.c(17): warning #167: argument of type "int (*)[2]" is incompatible with parameter of type "const int (*)[2]"
1>        foo(stuff);
1>            ^
1>  
1>main.c(18): warning #167: argument of type "int (*)[2]" is incompatible with parameter of type "const int (*)[2]"
1>        foo2(stuff);

为什么这应该是一个警告? 通常的作法是通过一个非const变量作为常量参数和类型和尺寸是相同的。

对于那些谁标志着这个重复的问题,我劝你三思。 如果别人遇到这样的警告,他们必须知道,在C参数在原型功能转换仿佛被赋值,然后搜索一个问题,是关于严格分配。 尽管答案最终被从C90 / C99相同的条款,问题是,我认为,有很大不同。

Answer 1:

你要把你的变量,常量,当你把它传递给需要常量的功能。

foo( (const int (*)[2]) stuff );

为什么我不能传递一个char **,其预计一个const char功能**?

类似的问题



Answer 2:

的值stuff阵列类型的int (*)[2]

int foo(const int pp_stuff[2][2])

相当于

int foo(const int (*pp_stuff)[2])

在函数调用,这是因为如果你指定类型的值int (*)[2]至类型的变量const int (*)[2]

参数在原型函数转换仿佛被分配。 和C让您分配两个指针,如果:

两个操作数是指向兼容类型的合格或不合格的版本,并且类型由左指出,有类型的所有预选赛指向的权利;

这里int (*)[2]const int (*)[2]是不同类型的合格/不合格的版本。 限定符适用于int不指针。

使用:

int foo(int (* const pp_stuff)[2])

如果你想使指针const ,而不是int元素。



文章来源: Intel C++ Compiler warning 167 when non-const argument is passed as const parameter [duplicate]