如何防止其他模块在c中调用我的extern函数

时间:2011-10-17 15:28:08

标签: c architecture module layer extern

假设我的程序包含多个图层,例如图层A 图层B 。文件 a_foo.c 包含我的函数定义,文件 a_foo.h 包含与 a_foo.c 中的定义相对应的函数声明。

我的设计是同一层中的模块(在本例中为第A层)可以调用 a_foo.h 中声明的函数,而第B层不能通过包含 a_foo.h 来调用。

那我怎么能实现呢?提前谢谢!

2 个答案:

答案 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_function1internal_function2根本不存在。他们完全看不见。即使我们在a_foo.h中包含了原型,外部代码仍然无法调用它们或完全看不到它们。

然而,这是C提供的唯一工具。对于它是什么,它工作得很好,但是如果A层代码足够大以至于你想要将它分布在许多源文件中,那么事情就会变得棘手--C只提供两个级别的可见性:一个源文件或所有源文件。没有中间水平说它应该在源文件A,B和C中可见,但不能在D,E或F中显示。