2016-10-04 105 views
1

我在读TLDP,注意到所有的全局变量和函数都声明为静态的。在进一步阅读之后,我了解到变量声明为静态,以减少名称空间污染的为什么linux内核中的全局变量是静态的?

根据this SO后,

静态函数是只对在同一个文件(更准确地说是相同的翻译单元)等 功能可见功能。

因此,将函数声明为静态将减少名称空间污染。但是,在变量的情况下,根据TLDP

当一个静态变量是由模块修改,所有其他模块将 看到新的值。

这会增加命名空间污染。不是全局静态变量对同一个翻译单元也是可见的吗?如果是这样,以上引用的声明如何是真的?我似乎错过了一些东西。

回答

2

当一个静态变量由模块

我相信你可能会误以为一句修改。它可能有点混乱。它不是指C static关键字。它是指C标准对“静态存储时间”的使用。参考C标准的第6.2.4节:

1一个对象有一个存储时间来决定它的生命周期。有 是三个存储持续时间:静态,自动和分配。

....

3其标识符被声明与外部或内部的键,或者与 存储类说明静态具有静态存储持续时间的对象。它 寿命程序

的整个执行即“静态存储”变量包括与C static关键字声明都全局变量和变量。在TLDP文章中,它指的是前者。

+0

对于内核模块,什么是“程序”?它是整个内核还是只是模块? – daltonfury42

+0

在全局变量方面,内核链接阶段比用户级程序更严格。内核构建可防止从模块访问任何全局变量,除非通过调用'EXPORT_SYMBOL'宏来显式标记它们。 – kaylum

+0

你能告诉我为什么所有的全局变量都需要声明为静态的吗? – daltonfury42

相关问题