因此,我很好奇如果需要在头文件中引用其实例的情况下如何在.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是什么。
我将如何以正确的方式做到这一点?
这样的事情应该可以正常工作。请注意,struct Node永不离开的定义List.c。
#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)
#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)
#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)
我很可能在此代码中有一些错误。如果发现任何问题,请随时进行修复。