Joh*_*itb 28
有一些混乱,因为static在C中可能意味着两件不同的事情.一个是静态存储持续时间,另一个是内部链接.static用作文件范围的关键字将给出与内部链接一起使用的函数或对象.
函数或对象的内部链接意味着如果你在另一个"文件"中声明另一个函数(这不是真正称为"文件",而是翻译单元 - TU),那么该声明将引用一个不同的函数:声明的名称在该单位将"链接"到与该另一个翻译单元中声明的名称不同的实体,该单元是该TU的"内部".这同样适用于对象.
无论是否声明了文件范围变量static,它仍然具有静态存储持续时间:这意味着它贯穿整个程序,并在程序终止时死亡.具有静态存储持续时间的对象的另一示例是字符串文字.存储静态存储持续时间的对象未指定,但通常存储它们取决于它们是否已初始化:初始化的文件范围变量通常存储在名为".data"的部分中,而非初始化文件-scope变量通常存储在名为".bss"的部分中.请记住,如果变量未初始化,则在程序开始时将初始化为零:".bss"部分通常由程序启动时的实现初始化为零.
我说"通常"到处都是,因为没有指定存储的东西.例如,某些实现可以将字符串文字存储在只读部分中.如果你有一个文件范围指针并且没有初始化它,那么实现会将它初始化为一个空指针,它不一定是所有空字节的对象:)
全局变量的范围在所有文件中..而静态全局变量的范围只是声明它的文件..为什么会这样?
全局变量旨在可从任何模块访问 - 这种做法被认为是不良实践,并且只有在绝对必要时才应使用.
文件范围的静态变量(我假设你在谈论"静态全局"时所说的)可以由单个编译单元(通常是文件)中的例程访问 - 其原因是限制它的范围.在修改使用该变量的代码时,您需要查看可能受影响的其他例程的位置有一个很好的限制.它还减少了名称冲突的机会.
使用全局变量时,如果另一组模块碰巧也使用具有相同名称的全局变量用于不同目的,则必须将一个模块修改为使用其他名称.静态变量不存在该问题.
| 归档时间: |
|
| 查看次数: |
41321 次 |
| 最近记录: |