我知道声明一个全局变量,因为STATIC会使它对当前文件可见.每次在文件中调用函数时,变量是否保留其数据?
例如,
假设一些文件调用下面的func1(),它修改静态全局变量数据,然后调用func2()再次修改它.
下次文件调用func1()时,它是否会修改新的数据变量struct?或者它会保留先前调用中修改的先前数据吗?
STATIC MY_DATA Data1; void func1( ){ //modify Data1 func2(Data1); } void func2 (MY_DATA data){ // modify data }
John Bolling.. 5
关键字static
在文件范围具有不同的含义,然后在本地范围内.
在文件范围,static
声明内部链接.这意味着只有同一翻译单元中的其他代码才能看到声明的变量(或函数); 如果相同的名称出现在不同的文件中,则它指定一个单独的变量(函数).相反的是外部链接,您可以通过extern
关键字明确声明.此外,在函数范围内声明的变量没有链接 - 只能在声明它们的函数内访问它们.
另一方面,在本地范围中,static
声明静态存储持续时间,而不是默认的自动持续时间.具有静态持续时间的变量在程序启动时初始化,并在函数调用中保留其值,与具有自动持续时间的变量不同.
在文件范围内声明的所有变量和所有函数都具有静态持续时间,因此尽管可能存在混淆,但在不同的上下文中对于这两个不同的目的使用相同的关键字并不存在必要的模糊性.
至于您的示例,无论是否声明了文件范围变量static
,它都具有静态存储持续时间.因此,它的值将在函数调用中持续存在,并且同一文件中的所有函数将始终可以访问其当前值.如果未声明,static
则其他功能也可以访问它.
关键字static
在文件范围具有不同的含义,然后在本地范围内.
在文件范围,static
声明内部链接.这意味着只有同一翻译单元中的其他代码才能看到声明的变量(或函数); 如果相同的名称出现在不同的文件中,则它指定一个单独的变量(函数).相反的是外部链接,您可以通过extern
关键字明确声明.此外,在函数范围内声明的变量没有链接 - 只能在声明它们的函数内访问它们.
另一方面,在本地范围中,static
声明静态存储持续时间,而不是默认的自动持续时间.具有静态持续时间的变量在程序启动时初始化,并在函数调用中保留其值,与具有自动持续时间的变量不同.
在文件范围内声明的所有变量和所有函数都具有静态持续时间,因此尽管可能存在混淆,但在不同的上下文中对于这两个不同的目的使用相同的关键字并不存在必要的模糊性.
至于您的示例,无论是否声明了文件范围变量static
,它都具有静态存储持续时间.因此,它的值将在函数调用中持续存在,并且同一文件中的所有函数将始终可以访问其当前值.如果未声明,static
则其他功能也可以访问它.