指向自定义结构类型定义问题的指针
Pointer to custom struct typedef issue
作为一个简单的初学者项目,我正在尝试构建一个链表。我为节点创建了一个结构 typedef。我的问题是我想要另一个 typedef 作为指向列表节点的指针,出于某种原因,这是行不通的,我很困惑。我在这里阅读了其他答案,其中 none 有效。
main.c
#include <stdio.h>
#include "linkedList.h"
int main(int argc, char **argv){
return 0;
}
linkedList.h
#ifndef linkedList
#define linkedList
typedef struct listStrNode {
char *string;
struct listStrNode *next;
} listStringNode;
typedef listStringNode *linkedList;
#endif
错误
In file included from main.c:3:
linkedList.h:9:35: error: expected identifier or ‘(’ before ‘;’ token
9 | typedef listStringNode *linkedList;
|
编译:
gcc main.c
有什么想法吗?
#define linkedList
这会将 linkedList
的所有实例替换为空字符串。这实际上意味着 typedef listStringNode *linkedList;
变为 typedef listStringNode *;
并因此出现错误。要修复,请重命名 #define
或类型名称。一个常见的约定是使用文件名的表示作为包含保护:例如#define LINKEDLIST_H
在您的代码(linkedList.h
文件)中,您有这个宏定义
#define linkedList
在预处理阶段之后,将导致 空 替换宏 linkedList
。
gcc
编译器有一个选项 -E
以预处理源代码的形式给出输出(基本上它在预处理阶段后停止)。使用 -E
选项编译代码时,会给出以下输出:
# gcc -E main.c
..... //showing only relevant part
.....
typedef struct listStrNode {
char *string;
struct listStrNode *next;
} listStringNode;
typedef listStringNode *;
^^^
|
[ check this ]
[ the empty replacement of macro 'linkedList' ]
.....
.....
因此您会收到 error: expected identifier
错误。
要解决这个问题,只需在linkedList.h
头文件中更改#include
守卫的名称即可。
作为一个简单的初学者项目,我正在尝试构建一个链表。我为节点创建了一个结构 typedef。我的问题是我想要另一个 typedef 作为指向列表节点的指针,出于某种原因,这是行不通的,我很困惑。我在这里阅读了其他答案,其中 none 有效。
main.c
#include <stdio.h>
#include "linkedList.h"
int main(int argc, char **argv){
return 0;
}
linkedList.h
#ifndef linkedList
#define linkedList
typedef struct listStrNode {
char *string;
struct listStrNode *next;
} listStringNode;
typedef listStringNode *linkedList;
#endif
错误
In file included from main.c:3:
linkedList.h:9:35: error: expected identifier or ‘(’ before ‘;’ token
9 | typedef listStringNode *linkedList;
|
编译:
gcc main.c
有什么想法吗?
#define linkedList
这会将 linkedList
的所有实例替换为空字符串。这实际上意味着 typedef listStringNode *linkedList;
变为 typedef listStringNode *;
并因此出现错误。要修复,请重命名 #define
或类型名称。一个常见的约定是使用文件名的表示作为包含保护:例如#define LINKEDLIST_H
在您的代码(linkedList.h
文件)中,您有这个宏定义
#define linkedList
在预处理阶段之后,将导致 空 替换宏 linkedList
。
gcc
编译器有一个选项 -E
以预处理源代码的形式给出输出(基本上它在预处理阶段后停止)。使用 -E
选项编译代码时,会给出以下输出:
# gcc -E main.c
..... //showing only relevant part
.....
typedef struct listStrNode {
char *string;
struct listStrNode *next;
} listStringNode;
typedef listStringNode *;
^^^
|
[ check this ]
[ the empty replacement of macro 'linkedList' ]
.....
.....
因此您会收到 error: expected identifier
错误。
要解决这个问题,只需在linkedList.h
头文件中更改#include
守卫的名称即可。