未知类型名称C vs C ++

时间:2016-07-18 06:19:05

标签: c struct compiler-errors

我试图创建一个包含指向它的指针的结构:

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

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

  

:5:2:错误:未知类型名称&#39; test&#39;

但是在g ++上编译的时候它很好。

所以我想要理解的是:

1)造成这种差异的原因是什么?我认为如果gcc使用一次通过编译并且g ++使用可以解释它的multipass,但据我所知,这不是真的。

2)如何避免此错误并使用指向它自己类型的指针定义结构? (除非没有其他选择,否则我不想使用空格*或使用铸造)

3 个答案:

答案 0 :(得分:6)

你必须在test * t之前编写struct来定义指向struct的指针:

struct test* t;

这是C和C ++之间的一个不同。

答案 1 :(得分:2)

您的语法在&#34; C&#34;中不正确。您必须使用struct <structname>* <varname>;格式。

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

固定代码:

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

Live demo

答案 2 :(得分:0)

您需要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编译器中编译。