.c文件中的静态函数/变量

Matias Chara

我在描述为什么在全局函数或变量上使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++头文件中的静态函数

来自分类Dev

静态函数中包含文件的全局变量

来自分类Dev

C ++中的静态函数

来自分类Dev

让静态函数变量取C中的参数值

来自分类Dev

从静态函数C ++访问staic变量

来自分类Dev

C ++中静态函数之间的区别

来自分类Dev

C中静态函数的目的

来自分类Dev

C ++中的静态函数访问

来自分类Dev

从静态函数中调用非静态变量

来自分类Dev

从变量调用静态函数

来自分类Dev

将类的静态函数存储在变量中

来自分类Dev

在C#中使用静态函数和变量的困难

来自分类Dev

c ++ 11静态函数成员变量

来自分类Dev

在C#中使用静态函数和变量的困难

来自分类Dev

C:将静态函数原型放入实现文件中是一种好习惯吗?

来自分类Dev

C中静态函数声明之间的区别

来自分类Dev

在C ++中对模板参数调用静态函数

来自分类Dev

自己类中的C ++非静态函数指针

来自分类Dev

C# 中的静态函数,并发问题

来自分类Dev

将变量传递给静态函数

来自分类Dev

如何从C ++中的静态函数内部将指向静态函数的指针作为另一个静态函数的参数传递

来自分类Dev

在Java中,原始静态变量和静态函数存储在哪里?

来自分类Dev

在Java中,原始静态变量和静态函数存储在哪里?

来自分类Dev

访问文件外的静态函数

来自分类Dev

同一个函数中的静态函数变量初始化顺序

来自分类Dev

从静态函数调用非静态变量

来自分类Dev

从静态函数调用非静态变量

来自分类Dev

通过静态函数增加非静态变量

来自分类Dev

案例类中的静态函数(Scala)