【问题标题】:Can gcc display the pointer types when reporting "assignment from incompatible pointer type"?报告“来自不兼容指针类型的赋值”时,gcc 可以显示指针类型吗?
【发布时间】:2023-03-03 19:44:01
【问题描述】:

今天早些时候,我正在研究这个问题:Why does one need to specify the row while assigning a pointer to a 2D Array? 在尝试将多维数组的标识符分配给指针时所涉及的类型存在一些混淆/分歧。具体来说,它是否会“衰减”或“转换”(或任何您喜欢的命名法,因为似乎对此也存在分歧)为 char **char ()[5]char (*)[5]

(基于下面的cmets,我在这里包含了来自链接问题的代码示例。不要怪我,不是我写的。)

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 版本,显然不是 - 在不兼容的指针类型之间的常规分配中,我只得到assignment from incompatible pointer type。至于确定数组表达式“衰减”到什么,T 数组衰减为指向T 的指针 - 如果T 是类似int 的标量,则int 数组衰减为指向@ 的指针987654338@。如果T 是“int 的数组”,则int 数组的数组衰减为指向int 数组的指针等
  • 请在未显示预期信息的地方发布MCVE
  • @M.M - 如帖子中所示,我使用了链接问题中的代码示例。我认为没有理由在这里复制该代码。如果其他人认为它有帮助/必要,那么我会这样做。
  • 很明显。不需要海事组织。很容易检查。
  • @PeterJ_01 - 包含在此处而不是链接的原因是不能保证该链接在一年后仍然有效,从而使依赖于链接内容的问题和答案一文不值。问题中应包含所有必要的代码。

标签: c gcc gcc-warning


【解决方案1】:

安装更新版本的 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。 (如有必要,请单击编译器窗口底部的“输出”按钮以查看警告。)

【讨论】:

  • 不错。很高兴看到他们终于更新了它。我会选择你的新答案作为正确答案。
  • @AndrewCottrell:这个功能实际上是 added to the trunk 早在 2017 年 8 月 - 比你原来的问题早了将近三个月 :-)
  • 哈!不幸的是,像许多固件开发人员一样,我经常被供应商提供的任何编译器所困扰。 IDE、编译器和工具自始至终都是陈旧且有缺陷的。
  • @AndrewCottrell 即使您需要使用供应商编译器生成二进制文件,您也可以使用较新的编译器运行并行构建以获得改进的诊断功能
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 2013-06-21
  • 2019-06-05
  • 2016-09-16
  • 2011-06-21
  • 1970-01-01
  • 2014-12-14
  • 2014-11-03
相关资源
最近更新 更多