0

我知道在编程中保持简单并且能够被改变是很重要的。所以对我来说,这意味着使用不同的文件和函数并将它们分开以更容易隔离错误并提高可读性非常重要。

我是 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 来包含结构或 typedef?

4

4 回答 4

2

您必须使用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;
于 2013-10-05T19:10:18.560 回答
1

在全局范围内,您可以只声明/定义函数、结构或全局变量。您不能像那样调用函数(字面意思是“无处不在”)。从内部创建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 ;
于 2013-10-05T19:10:43.373 回答
0

只需将您的代码放在这样的函数中:

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

int main(void) {
    struct nodeTest* first = malloc(sizeof(struct nodeTest));
    return 0;
}
于 2013-10-05T19:21:42.073 回答
0

你需要定义 nodetest 类型

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

 }nodeTest; 

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

于 2013-10-05T19:11:25.223 回答