4

我有一个大型代码库,最近从微软的编译器转移到了英特尔 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;
}

ICC会给我警告:

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 中的子句相同,但我认为问题是完全不同的。

4

2 回答 2

2

将变量传递给需要 const 的函数时,将其转换为 const。

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

为什么我不能将 char ** 传递给需要 const char ** 的函数?

类似的问题

于 2013-02-15T18:46:21.790 回答
2

stuff数组的值是类型int (*)[2]

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

相当于

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

在函数调用中,就好像您将 type 的值分配给 typeint (*)[2]的变量const int (*)[2]

参数的转换就像通过原型函数中的赋值一样。如果满足以下条件,C 允许您分配两个指针:

两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左边指向的类型具有右边指向的类型的所有限定符;

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

利用:

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

如果你想制作指针const而不是int元素。

于 2013-02-15T18:46:40.257 回答