我正在写一个库。假设它有两个重要的函数 foo1 和 foo2。这两个函数都调用了第三个函数 foo0。但是 foo0 不打算在库编译并链接到之后使用。有没有办法让库的用户无法使用 foo0?
也许我想让用户可以使用函数只是一种伪善,但我认为这会使库变得更干净。而且我很确定我已经使用过执行此操作的 API。
后续问题:如果可能的话,我想创建两个不同的头文件吗?一种用于编译库,一种仅包含用户所需的 typedef、枚举、原型等?
谢谢!
C 标准不提供跨多个翻译单元执行此操作的方法。一些链接器提供了帮助解决此问题的方法。使用某些链接器,您可以将多个目标模块链接在一起以生成组合的目标模块,同时指示链接器从目标模块发布的名称中排除某些名称。在生成组合对象模块的链接期间,在一个输入对象模块上使用并在另一个输入对象模块中定义的名称被解析,因此它们不再需要在外部可见。
您需要指定您正在使用的开发人员工具才能获得进一步的帮助。
最好的可移植方法是在构建时随机化函数名称,并使用预处理器宏将固定名称公开给源文件,但不在公共头文件中。如果函数名称是非描述性的并且每次构建都会更改,那么没有人会尝试使用它。