如果我有一个名为“Header1.h”的头文件和另一个名为“Header2.h”的头文件,并将第一个头文件包含到第二个头文件中,Header 1-〉Header 2,我将可以从Header 2访问Header 1的代码。(例如,如果我在Header 1中定义了一个结构体,我现在可以在Header 2中创建该结构体类型的变量)。
现在,如果我有一个名为“Main.c”的.c文件,并且如果我在“Main.c”中包含“Header2.h”,Header 2-〉Main,我将能够从Main访问Header 2的代码,但我也能够从Main访问Header 1的代码,就好像我在“Main.c”中包含了“Header1.h”一样,Header 1-〉Main。(例如,我可以在“Main. c”中创建一个struct类型的变量[在“Header1.h”中定义的变量])。
有没有办法限制从“Main. c”访问“Header1.h”,只允许“Header2.h”访问“Header2.h”的信息,并对头文件执行类似的“私有化”?
将评论转录为问题:
一月一日:
void printLinkedListImpl(Node* head)
{
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
一个月一个月:
typedef struct {
Node* head;
int size;
void (*printLinkedList)(Node*);
} LinkedList;
LinkedList* LinkedListConstructorImpl() {
LinkedList* linkedList = (LinkedList*)malloc(sizeof(LinkedList));
linkedList->head = NULL;
linkedList->size = 0;
linkedList->printLinkedList = &printLinkedListImpl;
}
x一个月两个月一个月:
void runner() {
LinkedList* linkedList = LinkedListConstructorImpl();
}
1条答案
按热度按时间p8h8hvxi1#
我看到两个主要选项:
Header2.h
需要Header1.h
的内容,在这种情况下,您不能明智地忽略Header1.h
的内容。Header2.h
不需要Header1.h
的内容,在这种情况下,Header2.h
不应包括Header1.h
。根据应用的选项使用标头编写代码。
你需要一个很好的理由来决定这两个选项中的一个还是另一个。但是,在包含
Header2.h
之前,可以为Header1.h
定义头保护:但是,正如我在开头所述,
Header2.h
要么需要Header1.h
中的信息来编译(在这种情况下,这将导致编译失败),要么不需要(在这种情况下,Header2.h
不应包含Header1.h
)。头文件不应该像
Header1.h
那样定义通用函数。头文件应该声明函数、类型、枚举、宏--也许还可以定义static inline
函数--但不应该定义变量或函数。如果在头文件中定义函数,则头文件只能由一个源文件使用,但是头的全部意义在于在源文件之间共享信息。如果你不确定如何从多个源文件构建程序,那就是另一个问题了--这个问题已经被回答过很多次了。例如,Compiling multiple C files in a program,通过搜索SO,可以找到许多关于不同IDE的问题和答案。