多个头文件到一个源文件?

问题描述 投票:0回答:3

我有一个名为 source.c 的源文件和一个名为 source.h 的公共头文件。 source.c 包含 s

#include "source.h"

我不希望source.c中的所有函数都是公共的,因此我想要另一个名为priv_source.h的头文件,它引用source.c中的一些私有函数。

编译器是否理解 priv_source.h 也是 source.c 的头文件,或者我是否必须创建另一个名为 priv_source.c 的 c 文件?

c header-files
3个回答
9
投票

编译器是否理解

priv_source.h
也是
source.c
的头文件,还是我必须制作另一个名为
priv_source.c
的 c 文件?

C 编译器不建立任何此类连接:所有文件、头文件和源代码都与编译器无关。它所知道的只是需要处理的翻译单元的名称(即 .c 文件的名称)以及这些翻译单元包含的标头的名称。

将声明分为两部分是很常见的——公共声明和私有声明。然而,在这种情况下,私有标头将包含公共标头,如下所示:

源.h

// Public declarations go here
void public_function1(int, int);
void public_function2(int, double, int);

priv_source.h

#include "source.h"
void private_function1(float);
void private_function2(char*);

来源.c

#include "priv_source.h"

0
投票

你的问题有两点:

  1. 函数声明被放入头文件中,以便可以 包含到多个源文件中,无需明确需要 在每个源文件中声明。因此,只需将这些声明放入您希望也可用于其他文件的头文件中。
  2. 如果某些功能需要限制在特定文件中,请使用 该函数定义为
    static
    。一旦将函数定义为
    static
    ,从外部看不到链接。范围 该函数的功能将仅限于同一编译单元, 通常只有该文件。

-1
投票

在 C 中,默认情况下,所有函数都是公共的,这意味着如果源文件仅包含标头,则在任何标头内声明的函数都可以被其他方法使用。现在,如果您显式声明像

static return_type name(/*some arguments may or may not*/)
这样的函数,则无法在该文件外部访问它。现在,没有这样的特权来隐藏任何像Java,C ++和C#等函数。我不确定这是否可以通过使用
#if
#elif
#endif
语句来实现。您必须为代码中呈现的函数编写逻辑,然后放入
#if
。因为如果不满足
#if
语句的 if 条件,那么在预处理器阶段之后,该部分将从我们的代码中消失,类似于代码中的注释。我不确定,但可能是。

© www.soinside.com 2019 - 2024. All rights reserved.