我有一个大型代码库,最近从微软的编译器转移到了英特尔 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 中的子句相同,但我认为问题是完全不同的。