我在描述为什么在全局函数或变量上使用static关键字时所遇到的大多数解释都将其影响描述如下:“全局范围内的静态标记函数或变量对外部文件(尤其是编译单元)不可见它们在哪里定义”。鉴于除与内联结合外,.h文件中很少使用静态函数,所以我问:为什么当.c文件从未包含在任何其他编译单元中时,为什么需要将.c文件中的函数和变量标记为静态? ,从而无法将功能标记为静态,从而使它们在其他编译单元中“不可见”?
考虑:
// a.c
static void f(void) {...}
void DoIt(void) {...}
和
// b.c
static void f(void) {...}
void DoIt(void) {...}
现在,编译器从每个源文件中生成目标文件,而无需知道名称冲突。该void f(void)
签名是从连接器时隐时现a
,并b
连接成一个程序,因为static关键字限制他们文件范围内,但它可以看到两个void DoIt(void)
签名,因为他们都是在全局范围内。现在考虑:
// c.c
extern void DoIt(void);
static void f(void)
{
DoIt(void); // Which implementation should be called here?
}
仅仅因为您从未编写过带有函数名的头文件,并不意味着您或某些程序员不会尝试在其他地方使用该符号名。使用static可以将名称污染限制在全球范围内,因此希望您不会遇到太多冲突。
我们在文件范围内隐藏符号名称的另一个原因是,使其他程序员难以使用我们不打算使用的功能。您在全球范围内公开的每个符号都是潜在的支持电话。如果您有数百个依赖内部位的产品/开发人员,那么可能很难重构或修改代码。通过在文件作用域中将它们隐藏起来,您是在说“我将不支持您依赖这些符号”,因此,如果他们继续这样做并继续这样做,则他们无权在您删除它们或修改它们的方式时提出投诉。由您的代码使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句