参考:
static_百度百科(里面的程序代码只可参考思路,有错误)
近期编写的程序中,有一些变量:如数据的输入路径、输出路径、某些数据的范围区间等,在main程序的最开始被赋值,之后很多其他源文件中也会用到。
通常我的思路是,把所需的变量作为函数的参数传递。最近经常遇到这样的问题:函数A需要调用函数B,函数B调用函数C,C需要用到一些配置参数,而这些参数AB都不会用到,但是由于AB调用C,因此函数AB的形参都要包含这些参数,使得函数AB的参数看起来非常多,显得冗余,编程麻烦。因此,便产生了以下问题:
“是否存在一种变量,它在main中被初始化一次,其后其值不能被更改,并且能被其他所有源文件的函数共享?”
Google给出的解答是:全局变量和静态全局变量
全局变量的特点:能被所有源文件所共享,在某个源文件中定义,在其他源文件中通过extern 来访问,但是只满足被所有源文件共享,不满足“只被初始化一次,其后其值不能被更改”,所有共享文件中的函数都能改变它的值(危险)。
静态全局变量的特点是 :只被所在的源文件中的函数共享,其他的源文件即使通过extern也无法访问。
因此,要解决上述问题,我们可以这麽做:
在初始使用这些参数的源文件中定义这些参数变量,如果其他源文件中的函数需要使用这些参数,那么就在源文件中通过extern的方式来声明,并通过将该参数声明为函数的const形参的形式来使用,这样就保证该变量不会被函数修改。
接下来,又产生了新的问题:
我在头文件中定义所需的全局变量,在需要这些变量的源文件中包含这个头文件,不也可以吗?
如果这么做,编译是无法通过的,会产生error LNK2005
error LNK2005: "int enzyme_type" (?enzyme_type@@3HA) 已经在 file_operation.obj 中定义
意思就是编译器认为你重定义了。为什么会这样呢?这就要理解编译器的工作原理,可参考c语言:全局变量在多个c文件中的公用方法和.c文件和.h文件的关系
在编译过程中,编译器实际上是把头文件中的内容原封不动的复制到了包含它的源文件中,因此就相当于重定义。
正确的做法只能是在某个源文件中定义全局变量,并在其他的源文件中通过extern声明它。