If I had a header file named "Header1.h" and another header file named "Header2.h", and include the first header file into the second, Header1 -> Header2, I would have access to Header1's code from Header2 . (For example, if I had defined a struct inside Header1, I could now make variables of that struct type in Header2).
Now if I had a .c file named "Main.c" and if I include "Header2.h" in "Main.c", Header2 -> Main, I would be able to access Header2's code from Main, but I would also be able to access Header1's code from Main as if I have included "Header1.h" inside "Main.c" specifically as well, Header1 -> Main. (For example, I could make a variable of type struct [the one defined in "Header1.h"] inside "Main.c").
Is there a way for me to restrict such access to "Header1.h" from "Main.c" and allow only "Header2.h" to be able to access information from "Header2.h", and perform similar "privatization" of a header file?
Transcribing a comment into the question:
Header1.h
:
void printLinkedListImpl(Node* head)
{
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
Header2.h
:
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;
}
Main.c
:
void runner() {
LinkedList* linkedList = LinkedListConstructorImpl();
}
CodePudding user response:
I see two main options:
Header2.h
needs the contents ofHeader1.h
, in which case you can't sensibly want to omit the contents ofHeader1.h
.Header2.h
does not need the contents ofHeader1.h
, in which caseHeader2.h
should not includeHeader1.h
.
Write the code using the headers according to which option applies.
You would need a good reason not to decide on one or the other of those two options. However, it might be possible to define the header guard for Header1.h
before including Header2.h
:
Header1.h
#ifndef HEADER1_H
#define HEADER1_H
…
#endif
Header2.h
#ifndef HEADER2_H
#define HEADER2_H
#include "Header1.h"
…
#endif
Main.c
…
#define HEADER1_H
#include "Header2.h"
…
But, as I stated at the outset, either Header2.h
needs the information from Header1.h
to compile (in which case this will cause a compilation failure), or it doesn't (in which case Header2.h
should not include Header1.h
).
After transcribing the comment into the question:
Header files should not define general functions like it appears Header1.h
does. A header should declare functions, types, enumerations, macros — and may perhaps define static inline
functions — but should not define variables or functions. (See also How do I use extern
to share variables between source files?). If you define functions in a header, the header can only be used by one source file, but the whole point of a header is to share information between source files.
If you're not sure how to build programs from multiple source files, that is a different question — one which has been answered many times. For example, Compiling multiple C files in a program, and there are numerous questions and answers for different IDEs that can be found by searching on SO with [c] compile multiple files program
.