假设我的程序包含多个图层,例如图层A 和图层B 。文件 a_foo.c 包含我的函数定义,文件 a_foo.h 包含与 a_foo.c 中的定义相对应的函数声明。
我的设计是同一层中的模块(在本例中为第A层)可以调用 a_foo.h 中声明的函数,而第B层不能通过包含 a_foo.h 来调用。
那我怎么能实现呢?提前谢谢!
答案 0 :(得分:1)
您应该将两个图层分成两个位于不同目录中的便捷库,每个图层的公共头文件只包含在一个公共包含目录中。 因此,您将避免在B层中意外包含a_foo.h。
如果您需要更强的访问控制,则需要依赖系统的hackery。但是,在大多数情况下,这是非常不必要的。
答案 1 :(得分:1)
据推测,您可以在任何给定的图层中拥有一些(可以仅几个)函数,这些函数可以/将与其他图层进行通信。其他大多数只在该层内部使用。
工具C提供的工作是static
- 外部世界可以看到的少数函数(可以这么说)是extern
,并在标题中进行原型化。其余的是static
。这意味着他们的名字只能在那个TU中看到,所以没有其他人可以打电话给他们,甚至根本看不到他们。
// a_foo.c
static void internal_function1(whatever_args) { }
static void internal_function2(whatever_args) { }
void external_function1(args) { /* this code can use internal_function* */ }
// f_foo.h
void external_function1(args);
就a_foo.c之外的任何事情而言,名称internal_function1
和internal_function2
根本不存在。他们完全看不见。即使我们在a_foo.h中包含了原型,外部代码仍然无法调用它们或完全看不到它们。
然而,这是C提供的唯一工具。对于它是什么,它工作得很好,但是如果A层代码足够大以至于你想要将它分布在许多源文件中,那么事情就会变得棘手--C只提供两个级别的可见性:一个源文件或所有源文件。没有中间水平说它应该在源文件A,B和C中可见,但不能在D,E或F中显示。