gcc 可以在报告 "assignment from incompatible pointer type" 时显示指针类型吗?
Can gcc display the pointer types when reporting "assignment from incompatible pointer type"?
今天早些时候我在研究这个问题:Why does one need to specify the row while assigning a pointer to a 2D Array?有一些关于尝试将多维数组的标识符分配给指针时涉及的类型的问题confusion/disagreement。具体来说,它是 "decay" 还是 "convert"(或者任何你喜欢的命名法,因为似乎对此也存在分歧)到 char **
或 char ()[5]
或 char (*)[5]
.
(根据下面的评论,我在这里包含了链接问题中的代码示例。不要怪我,我没有写它。)
int main()
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
char *p1,*p2;
p1=onedstring;
p2=twodstring;
p2=twodstring[1];
}
我测试了我的编译器如何从该问题的代码中报告警告并得到了这个结果:
(编译器: gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4))
decay.c:15:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
p2=twodstring;
它报告不兼容的指针类型但不报告涉及的类型,这在这种情况下会很有帮助。我还没有找到一种方法(还)让那个特定的警告也显示类型。但是,我发现调用函数而不是赋值 会 导致包含类型的注释。这是示例代码(请注意,除了生成编译器警告外,它绝对没有任何作用):
void function_to_trigger_warning(char *c){}
int main(int argc, char **argv)
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
function_to_trigger_warning(onedstring);
function_to_trigger_warning(twodstring);
return 0;
}
这是警告输出:
decay.c: In function ‘main’:
decay.c:20:33: warning: passing argument 1 of ‘function_to_trigger_warning’ from incompatible pointer type [-Wincompatible-pointer-types]
function_to_trigger_warning(twodstring);
^
decay.c:7:6: note: expected ‘char *’ but argument is of type ‘char (*)[5]’
void function_to_trigger_warning(char *c)
^
根据 gcc 的说法,为了指针分配的目的,twodstring
被视为 char (*)[5]
。那是有价值的信息!
长话短说(我知道,太晚了):在 gcc 中有没有办法从其他指针分配警告中获得类似的输出?
安装更新版本的 gcc。使用 gcc 8.1 或更新版本,您的示例会产生警告:
foo1.c: In function ‘main’:
foo1.c:8:5: warning: assignment to ‘char *’ from incompatible pointer type ‘char (*)[5]’ [-Wincompatible-pointer-types]
8 | p2=twodstring;
| ^
Try it on Compiler Explorer。 (如有必要,单击编译器底部的 "Output" 按钮 window 以查看警告。)
今天早些时候我在研究这个问题:Why does one need to specify the row while assigning a pointer to a 2D Array?有一些关于尝试将多维数组的标识符分配给指针时涉及的类型的问题confusion/disagreement。具体来说,它是 "decay" 还是 "convert"(或者任何你喜欢的命名法,因为似乎对此也存在分歧)到 char **
或 char ()[5]
或 char (*)[5]
.
(根据下面的评论,我在这里包含了链接问题中的代码示例。不要怪我,我没有写它。)
int main()
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
char *p1,*p2;
p1=onedstring;
p2=twodstring;
p2=twodstring[1];
}
我测试了我的编译器如何从该问题的代码中报告警告并得到了这个结果:
(编译器: gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4))
decay.c:15:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
p2=twodstring;
它报告不兼容的指针类型但不报告涉及的类型,这在这种情况下会很有帮助。我还没有找到一种方法(还)让那个特定的警告也显示类型。但是,我发现调用函数而不是赋值 会 导致包含类型的注释。这是示例代码(请注意,除了生成编译器警告外,它绝对没有任何作用):
void function_to_trigger_warning(char *c){}
int main(int argc, char **argv)
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
function_to_trigger_warning(onedstring);
function_to_trigger_warning(twodstring);
return 0;
}
这是警告输出:
decay.c: In function ‘main’:
decay.c:20:33: warning: passing argument 1 of ‘function_to_trigger_warning’ from incompatible pointer type [-Wincompatible-pointer-types]
function_to_trigger_warning(twodstring);
^
decay.c:7:6: note: expected ‘char *’ but argument is of type ‘char (*)[5]’
void function_to_trigger_warning(char *c)
^
根据 gcc 的说法,为了指针分配的目的,twodstring
被视为 char (*)[5]
。那是有价值的信息!
长话短说(我知道,太晚了):在 gcc 中有没有办法从其他指针分配警告中获得类似的输出?
安装更新版本的 gcc。使用 gcc 8.1 或更新版本,您的示例会产生警告:
foo1.c: In function ‘main’:
foo1.c:8:5: warning: assignment to ‘char *’ from incompatible pointer type ‘char (*)[5]’ [-Wincompatible-pointer-types]
8 | p2=twodstring;
| ^
Try it on Compiler Explorer。 (如有必要,单击编译器底部的 "Output" 按钮 window 以查看警告。)