c - 如何从 typedef 生成静态结构

标签 c struct static

我有一个头文件list.h和一个源文件list.c,它们定义了list.h中的函数。 我这里有一个结构:

    typedef struct ListNode{
 struct ListNode* next;
 struct ListNode* prev;
 void *value;
    }Node;
    typedef struct List{
 Node *first;
 Node *last;
 int count;
    }List;

当编译器不接受同时使用 static 和 typedef 时,如何使它们仅对 list.h 中的函数可见?这些是我在 list.h 中声明的函数:

    List *List_create();
    void List_destroy(List *list);
    void *List_remove(List *list,Node *node);

最佳答案

您可以使用指向不透明结构的指针来隐藏结构 ListNode 的内容。在 header 中,仅使用包含不透明声明

typedef struct ListNode Node;
typedef struct List List;

和函数声明。这些告诉编译器结构和 typedef 存在,但不告诉编译器结构包含什么。

list.c 中,包含完整的声明,但不作为 typedef,因为头文件已经告诉编译器有关 typedef 的名称。

struct ListNode {
    /* contents */
};
struct List {
    /* contents */
};

这样,结构体的内容在其他 C 文件中不可用,但 list.c 中的函数仍然可以使用它们。这也意味着其他 C 文件无法创建这些结构的新实例,除非使用 list.h 中提供的函数。

关于c - 如何从 typedef 生成静态结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57077394/

相关文章:

c - 当我尝试定义结构的元素时,我不断收到错误消息

C:制作通用迭代函数?

css - Express static 不会从 root 加载 CSS 文件

c - 将整数添加到c中的char数组

c++ - 使用 MI 命令在 GDB 中发送 'monitor reset halt'

C 结构指针作为参数 : making permanent changes to the struct

c++ - 跨系统静态成员初始化

c# - 调用 DLL 方法时,方法的类型签名与 PInvoke 不兼容

c++ - AVX 4 位整数

c - 没有静态存储的移动平均线故障