1.
最理想的情况是,一个模块(比如一个库)只输出指定的外部接口,其余内部接口对外都不可见,都是static的。
这个目标不太好实现。
如果是一个很小的模块,所有代码都在一个文件中,只有少量的对外接口,也只有少量的内部接口,这是可以实现的。
但是,一般意义上的一个模块,通常是较大的,包含多个较小的子模块,除了对外提供的接口和子模块内部的接口,还有子模块之间交互的接口。子模块之间交互的接口,不应该让外部看见,但又不是子模块内部的接口,无法做成static。
为了处理子模块之间接口的问题,可以把模块中所有代码都放在一个文件中,但这种做法比较少见。或者,把子模块之间的接口做成定义在头文件中的static函数,这种做法也不多见。目前只能采取折中办法,子模块之间的接口对外还是可见的,只是用特定的名称去约束,去检测,避免外部调用到这些接口。