【问题标题】:how to prevent other modules from calling my extern function in c如何防止其他模块在c中调用我的extern函数
【发布时间】:2011-10-17 15:28:07
【问题描述】:

假设我的程序由多个层组成,例如,Layer ALayer Ba_foo.c 文件包含我的函数定义,a_foo.h 文件包含与 a_foo.c 中的定义对应的函数声明。

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

那么我该如何实现呢?提前致谢!

【问题讨论】:

    标签: c architecture module layer extern


    【解决方案1】:

    你应该将你的两个层分成两个方便的库,驻留在不同的目录中,只有每个层的公共头文件在一个公共的包含目录中。 因此,您将避免在 B 层中意外包含 a_foo.h。

    如果您需要更强大的访问控制,则需要依赖系统的黑客。但是,在大多数情况下,这是非常不必要的。

    【讨论】:

    • 如果我没有误解,根据您的程序,如果 a_foo.h 包含在 B 层中并且调用了 a_foo.h 中的任何一个声明函数,则 B 层的链接器将抱怨未定义的引用XXX。我说的对吗?
    • @Tracy:不,但您必须将 a_foo.h 作为“../layer_A/a_foo.h”包含在 B 层中 - 这会立即告诉您您做错了什么。当您在编译器标志中有 -Icommon_includes 时,A 的公共头文件包含为“a_bar.h”,模块私有头文件必须包含为“../layer_A/a_foo.h”,这使得它们的隐私对代码编写者。链接器甚至不会被打扰。
    • 如果我在编译层 B 时添加 -lpath_to_layer_A 标志,这会解决显式路径包含问题吗? @thiton
    • @Tracy:那你刚刚破坏了封装。这种方法不是安全形式,只是一种封装策略,以避免意外使用另一层。但是您在这里需要任何安全措施,这种模式只是为了保护您免受疏忽。
    • 这可能是一个解决方案,虽然不是很彻底。非常感谢@thiton
    【解决方案2】:

    大概你会在任何给定的层中有一些(最好是只有几个)函数可以/将与其他层通信。其他大多数仅在该层内部使用。

    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 中不可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多