【问题标题】:unknown type name C vs C++未知类型名称 C vs C++
【发布时间】:2016-07-18 06:19:04
【问题描述】:

我尝试创建一个包含指向其类型的指针的结构:

#include <stdio.h>
struct test{
    test* t;
};
 int main(){
    return 0;
 }

使用 gcc 编译时,此代码产生了错误:

:5:2: 错误:未知类型名称“测试”

但是在 g++ 上编译时它运行良好。

所以我想了解的是:

1) 造成这种差异的原因是什么?我认为如果 gcc 使用 one-pass 编译而 g++ 使用 multipass 可以解释它,但据我了解,这是不正确的。

2) 如何避免此错误并使用指向其自身类型的指针定义结构? (除非没有其他选择,否则我不想使用 void* 或使用强制转换)

【问题讨论】:

  • 试试:struct test * t;作为结构变量。
  • 在这里查看答案:stackoverflow.com/questions/612328/…
  • C 和 C++ 是不同但相关的语言,您不应该期望 C++ 程序也是有效的 C 程序,尽管通常情况正好相反。
  • C 和 C++ 是不同的语言。请选择一个适合您问题的标签。
  • @CiaPan OP 实际上询问这些语言之间的区别。

标签: c struct compiler-errors


【解决方案1】:

你必须在 test* t 之前写 struct 来定义一个指向我们结构的指针:

struct test* t;

这是 C 和 C++ 的不同之处。

【讨论】:

    【解决方案2】:

    您在“C”中的语法不正确。您必须在格式中使用struct &lt;structname&gt;* &lt;varname&gt;;

    在c++中,你可以省略前面的“struct”。但是,在 C 中,您必须编写它来定义指向您的结构的指针。

    固定代码:

    #include <stdio.h>
    typedef struct test{
       struct test* t;
    } test;
     int main(){
        return 0;
     }
    

    Live demo

    【讨论】:

      【解决方案3】:

      您需要先typedef struct test test ; 才能以这种方式使用它。

      这应该可以正常工作:

      #include <stdio.h>
      struct test{
         struct test* t;
      };
      int main(){
          return 0;
      }
      

      或者你可以试试:

      #include <stdio.h>
      typedef struct test test;
      struct test{
         test* t;
      };
      int main(){
          return 0;
      }
      

      你的问题是 gcc 是一个 C 编译器并且从字面上接受类型。 如果您使用 c++ 编译器,它可能不在乎。 c++ 为您简化了 C 没有的类型。 小心这个事实。 C 代码将在 c++ 编译器中编译,但 c++ 不会在 c 编译器中编译。

      【讨论】:

      • "C 代码将在 c++ 编译器中编译" - 大多数 C 代码不是有效的 C++。
      • 这取决于您是否使用严格模式。依赖于 c++ 编译器以确保向后兼容性,编译器只会这样做。
      猜你喜欢
      • 2018-10-27
      • 2013-09-25
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2012-02-06
      • 2021-10-29
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多