在设计一个软件模块时,应当做到尽可能少地暴露只在模块内部使用的变量和函数,这可以通过使用static关键字做到。
当一个内部变量或函数并没有被声明成static的话,那意味着所设计的模块存在“洞”。通过这些“洞”其它的模块可以窥视到模块的内部实现,或通过这些“洞”影响模块的内部行为,而后者更加的可怕。理论上,一个模块不应当暴露任何一个内部变量,除非因为不可避免的某种因素,否则都应当通过提供函数接口的形式对变量进行存取。通过提供函数存取变量这种方式的好处是,如果某一天模块的实现需要被更改的话,完全可以让使用这一模块的用户不感知到内部实现的变化,这也正是基于接口编程所带来的好处。另外,将变量定义为static的话,可以避免在某种情形下因为各模块无意间重复定义同样的名字而导致的“离奇”软件缺陷,这类问题有时很难被查出,其跟源是C语言的编译规程无法检出它,《混淆指针和数组所导致的错误》一文解释了为什么会有这类问题发生。声明成static将导致相应的符号不会输出到目标文件的符号表中,进而就不会造成同名变量的错乱问题。最后,如果一个函数只用于模块内部使用的话,其原形声明也不应当出现在模块的头文件中。出现在头文件中的函数原型,其所隐含的意思就是这些函数是外部模块可以且仅可以调用的。
C语言在语法和语义上无法做到杜绝某些潜在的问题,或许正是因为这种不严谨给它带来了程序执行效率优势,以至于经历了三十多年的考验而依然是系统编程语言主流之一。使用了static的变量或函数,可以被他人轻松地去掉static关键字从而突破原本希望获得的限制,但无论如何static的存在都是给每一个试图这样做的人一个小小的警告 —— “我是static的,你真的想去掉我而打破原先的约束吗?”,这一警告对于一位专业的软件工程师来说能引起他必要的思考。除了这样,面对“可爱”的C语言还能怎样呢?
【编程好习惯】只暴露必要的变量和函数
最新推荐文章于 2024-09-09 14:59:20 发布