从另一个文件调用节点

时间:2013-10-05 19:08:18

标签: c struct typedef

我知道在编程中,保持简单并且能够进行更改非常重要。所以对我而言,这意味着使用不同的文件和功能并将它们分开以便更容易隔离故障并提高可读性非常重要。

我是C的新手,我不明白该怎么做。我有我的nodeTest.h

 #include <stdio.h>
 #include <stdlib.h>

 struct nodeTest
 {
     int data;
     struct nodeTest* next;

 };

然后我有另一个文件试图调用该结构

 #include <stdio.h>
 #include <stdlib.h>
 #include "nodeTest.h"

 nodeTest* first = (nodeTest*)malloc(sizeof(nodeTest));

我收到一条错误消息,指出nodeTest未声明(不在函数中)。这是什么意思,为什么我不能使用include来包含struct或typedef?

4 个答案:

答案 0 :(得分:3)

您必须使用struct NodeTest代替NodeTest

多数民众赞成因为C区分了三个名称空间:

  • 结构的命名空间。
  • 类型别名(类型名称)的命名空间。
  • 枚举和工会的命名空间。

因此,无论您想在何处使用结构,都必须指定名称引用结构的编译器。例如:

int main()
{
    struct NodeTest node;
}

该问题的一个解决方法是指定该结构的别名,以将结构“添加”到类型名称空间:

typedef NodeTest NodeTestType;

int main()
{
    NodeTestType node; //OK
}

或者使用常用的习惯用法,直接将结构声明为别名:

typedef struct { ... } NodeTest;

请注意,这句话的作用是为一个未命名的结构创建一个名为NodeTest的别名 你已在同一指令中声明。
这种方法的一个问题是你不能在结构中使用类型,因为它尚未声明。您可以解决命名结构的问题:

 typedef struct nodeTest //<-- Note that the struct is not anonimous
 {
     int data;
     struct nodeTest* next;
 } nodeTest;

答案 1 :(得分:2)

在全局范围内,您可以声明/定义函数,结构或全局变量。你不能像那样调用一个函数(字面意思是“无处不在”)。创建main并从内部致电malloc

int main(void) {
    nodeTest* first = (nodeTest*) malloc(sizeof(nodeTest));
    free(first);
    return 0;
}

struct nodeTest {
    int data;
    struct nodeTest* next;
};

定义struct nodeTest所以

nodeTest* first;
编译器不知道

。要解决这个问题,您可以使用:

struct nodeTest* first;

甚至更好:在定义typedef时使用struct,一切都会好的:

typedef struct nodeTest {
    int data;
    struct nodeTest* next;
} nodeTest ;

答案 2 :(得分:1)

您需要定义nodetest类型

typedef struct nodeTest_t
 {
     int data;
     struct nodeTest_t* next;

 }nodeTest; 

或者  在main()中,在nodeTest之前使用struct关键字。

答案 3 :(得分:1)

只需将代码置于如下函数中:

#include <stdio.h>
#include <stdlib.h>
#include "nodeTest.h"

int main(void) {
    struct nodeTest* first = malloc(sizeof(struct nodeTest));
    return 0;
}