gcc在报告 "assignment from incompatible pointer type"时可以显示指针类型吗?

标签 c gcc gcc-warning

今天早些时候我正在研究这个问题:Why does one need to specify the row while assigning a pointer to a 2D Array?在尝试将多维数组的标识符分配给指针时,对于所涉及的类型存在一些混淆/分歧。具体来说,它是否会“腐烂”或“转换”(或者您喜欢的任何术语,因为对此似乎也存在分歧)为 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]。这是有值(value)的信息!

长话短说(我知道,太晚了):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 。 (如有必要,请单击编译器窗口底部的“输出”按钮以查看警告。)

关于gcc在报告 "assignment from incompatible pointer type"时可以显示指针类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47085090/

相关文章:

c - 在函数内分配内存后使用双指针

C - 如何将一个字符串复制到字符数组的一个元素中?

c - linux中汇编和C的混合编程

c++ - 如何在 Linux 中调用 "cpuid"?

c - 在 GCC 中分配或执行具有不同枚举类型的算术时如何发出警告?

找不到这个简单的 C 代码有什么问题

C-Fortran 字符串互操作性

c - 无法访问字符指针数组

c++ - gcc 和 libstdc++ 向前兼容

c - 海合会 : division by zero