指向自定义结构类型定义问题的指针

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守卫的名称即可。