C语言编程。如果需要在头文件(.h)中引用其实例,如何在.c中隐藏该结构的实现

Yoh*_*oth 4 c struct

因此,我很好奇如果需要在头文件中引用其实例的情况下如何在.c文件中隐藏该结构的实现。例如,我在头文件中具有以下结构:

struct List
{
    NodePtr front;    
};
Run Code Online (Sandbox Code Playgroud)

我想在.c文件中声明NodePtr以隐藏其实现。在.c中:

struct Node
{
    void *value;
    struct Node *next;
};

typedef struct Node *NodePtr;
Run Code Online (Sandbox Code Playgroud)

但是,当然.h文件并不知道NodePtr是什么。

我将如何以正确的方式做到这一点?

Bil*_*nch 5

这样的事情应该可以正常工作。请注意,struct Node永不离开的定义List.c

list.h

#pragma once
#include <stdbool.h>

struct List {
    struct Node *front;
};

void list_init(struct List **list);
void list_free(struct List *list);
void list_insert(struct List *list, void *value);
bool list_contains(struct List *list, void *value);
Run Code Online (Sandbox Code Playgroud)

list.c

#include <stdbool.h>
#include <stdlib.h>
#include "list.h"

struct Node {
    void *value;
    struct Node *next;
};

void list_init(struct List **list) {
    *list = malloc(sizeof(**list));
}

void list_free(struct List *list) {
    struct Node *node = list->front;
    while (node != NULL) {
        struct Node *next = node->next;
        free(node);
        node = next;
    }
    free(list);
}

void list_insert(struct List *list, void *value) {
    struct Node *node = malloc(sizeof(*node));
    node->value = value;
    node->next = list->front;
    list->front = node;
}

bool list_contains(struct List *list, void *value) {
    struct Node *node;
    for (node = list->front; node != NULL; node = node->next)
        if (node->value == value)
            return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

main.c

#include <stdio.h>
#include "list.h"

int main() {
    struct List *l;
    list_init(&l);

    int *value_1 = malloc(sizeof(int));
    int *value_2 = malloc(sizeof(int));
    int *value_3 = malloc(sizeof(int));

    list_insert(l, value_1);
    list_insert(l, value_2);
    list_insert(l, value_3);

    printf("Does the list contain value_1: %d\n", list_contains(l, value_1));
    printf("Does the list contain null:    %d\n", list_contains(l, NULL));

    list_free(l);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很可能在此代码中有一些错误。如果发现任何问题,请随时进行修复。