最近、MicrosoftのコンパイラからIntelC++コンパイラに移行した大規模なコードベースがあります。私たちのチームの目標は、メインラインで警告なしにコンパイルすることです。切り替え以来、警告167の1つのインスタンスが私を混乱させました。次のコードをコンパイルすると、次のようになります。
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変数をconstパラメーターとして渡すのが一般的な方法であり、タイプと次元は同じです。
これを重複した質問としてマークした人には、再考することをお勧めします。他の誰かがこの警告に遭遇した場合、Cの引数がプロトタイプ関数での割り当てによるかのように変換されることを知ってから、厳密に割り当てに関する質問を検索する必要があります。答えはC90/C99と同じ条項になりますが、質問はかなり異なると思います。