我有一个名为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文件?
答案 0 :(得分:7)
编译器是否理解
priv_source.h
也是source.c
的头文件,还是我必须创建另一个名为priv_source.c
的c文件?
C编译器不进行任何此类连接:所有文件,标头和源都与编译器无关。它所知道的是它需要处理的翻译单元的名称(即.c文件的名称)以及这些翻译单元所包含的标题的名称。
将声明拆分为两部分是常见的 - 公共部分和私有部分。但是,在这种情况下,私有标题将包含公共标题,如下所示:
source.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*);
由source.c
#include "priv_source.h"
答案 1 :(得分:0)
你的问题有两点:
static
。将函数定义为
static
,从外面看不到链接。范围
该函数将仅限于同一个编译单元,
通常只是那个文件。答案 2 :(得分:0)
默认情况下,c中的所有函数都是public意味着如果该函数只包含标题,则任何标题内的函数声明都可以由其他方法使用。现在,如果您显式声明一个函数,如static return_type name(某些参数可能会或可能不会),那么这不能访问该文件的那一侧。现在没有这样的特权来隐藏任何函数,比如java,c ++和c#等。可能这可能是我不确定可以通过使用#if #elseif和#endif语句来实现。如果您的代码中存在该函数然后放入#if,则必须编写逻辑。因为在#if语句中,如果条件不满足,那么在预处理器阶段之后,该部分将从我们的代码中消失,类似于我们代码中的注释。看我不确定但可能是。 谢谢 asif aftab