您可以将头文件包含到另一个头文件中,但在.c文件中包含第二个头文件时,不自动包含第一个吗?

7hiiyaii  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(200)

如果我有一个名为“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();
}
p8h8hvxi

p8h8hvxi1#

我看到两个主要选项:

  1. Header2.h需要Header1.h的内容,在这种情况下,您不能明智地忽略Header1.h的内容。
  2. Header2.h不需要Header1.h的内容,在这种情况下,Header2.h不应包括Header1.h
    根据应用的选项使用标头编写代码。
    你需要一个很好的理由来决定这两个选项中的一个还是另一个。但是,在包含Header2.h之前,可以为Header1.h定义头保护:
    • 一米九十一**
#ifndef HEADER1_H
#define HEADER1_H
…
#endif
    • 一米十纳一x**
#ifndef HEADER2_H
#define HEADER2_H

#include "Header1.h"

…

#endif
    • 一米十一米一**
…
#define HEADER1_H
#include "Header2.h"
…

但是,正如我在开头所述,Header2.h要么需要Header1.h中的信息来编译(在这种情况下,这将导致编译失败),要么不需要(在这种情况下,Header2.h不应包含Header1.h)。

  • 将评论转录到问题中后:*

头文件不应该像Header1.h那样定义通用函数。头文件应该声明函数、类型、枚举、宏--也许还可以定义static inline函数--但不应该定义变量或函数。如果在头文件中定义函数,则头文件只能由一个源文件使用,但是头的全部意义在于在源文件之间共享信息。
如果你不确定如何从多个源文件构建程序,那就是另一个问题了--这个问题已经被回答过很多次了。例如,Compiling multiple C files in a program,通过搜索SO,可以找到许多关于不同IDE的问题和答案。

相关问题