【发布时间】:2013-02-15 18:35:14
【问题描述】:
我有一个大型代码库,最近从 Microsoft 的编译器转移到了英特尔 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 中的子句相同,但我认为问题是完全不同的。
【问题讨论】:
-
为什么不使用:int foo2(const int* pp_stuff)
-
@josh,因为它对其他开发人员的信息量不大。当我们传递固定维度的数组时,在声明中包含维度是自记录的。它还通过编译器警告/错误自我执行。
标签: c compiler-warnings icc