文件中的全局静态变量是否与函数中的局部静态变量相当?

时间:2016-01-06 15:41:29

标签: c variables static global

我知道声明一个全局变量,因为STATIC会使它对当前文件可见。每次在文件中调用函数时,变量是否保留其数据?

例如,

假设有一些文件调用下面的func1(),它会修改静态全局变量数据,然后再调用func2()来修改它。

下次文件调用func1()时,是否会修改新的数据变量struct?或者它会保留先前调用中修改的先前数据吗?

https://www.toggl.com/reports/api/v2/project/?user_agent=MYEMAIL@EMAIL.COM&project_id=9001&workspace_id=9001

1 个答案:

答案 0 :(得分:5)

关键字static在文件范围具有不同的含义,然后在本地范围内。

在文件范围内,static声明内部链接。这意味着只有同一翻译单元中的其他代码才能看到声明的变量(或函数);如果相同的名称出现在不同的文件中,则它指定一个单独的变量(函数)。相反的是外部链接,您可以通过extern关键字明确声明。此外,在函数范围内声明的变量具有 no 链接 - 只能在声明它们的函数内访问它们。

另一方面,在本地范围内,static声明静态存储持续时间,而不是默认的自动持续时间。具有静态持续时间的变量在程序启动时初始化,并在函数调用中保留其值,与具有自动持续时间的变量不同。

在文件范围内声明的所有变量和所有函数都具有静态持续时间,因此尽管可能存在混淆,但在不同的上下文中为这两个不同的目的使用相同的关键字并不存在本质的歧义。

至于您的示例,无论您的文件范围变量是否声明为static,它都具有静态存储持续时间。因此,它的值将在函数调用中持续存在,并且同一文件中的所有函数将始终可以访问其当前值。如果声明为static,那么其他功能也可以访问它。