在“ C”头文件中声明的静态函数

米格尔·阿泽维多:

对我而言,在源文件(即.c文件)中定义和声明静态函数是一条规则。

但是,在极少数情况下,我看到有人在头文件中声明它。由于静态函数具有内部链接,因此我们需要在每个文件中对其进行定义,因此我们在声明该函数的头文件中包含该头文件。在将某些东西声明为静态时,这看起来很奇怪,与我们通常想要的相去甚远。

另一方面,如果有人天真地尝试使用该函数而不定义它,则编译器会抱怨。因此,从某种意义上说,这样做听起来并不奇怪,甚至听起来并不奇怪。

我的问题是:

  • 在头文件中声明静态函数有什么问题?
  • 有什么风险?
  • 对编译时间有什么影响?
  • 运行时有任何风险吗?
彼得-恢复莫妮卡:

首先,我想澄清一下您所描述的情况:标头包含(仅)静态函数声明,而C文件包含定义(即函数的源代码)。例如

some.h:

static void f();
// potentially more declarations

some.c:

#include "some.h"
static void f() { printf("Hello world\n"); }
// more code, some of it potentially using f()

如果您描述的是这种情况,我对您的评论表示怀疑

由于静态函数具有内部链接,因此我们需要在每个文件中对其进行定义,因此我们在声明该函数的头文件中包含该头文件。

如果您声明了该函数但未在给定的翻译单元中使用它,则我认为不必定义它。gcc接受警告并接受它;除非我错过了一些东西,否则该标准似乎并没有禁止它。这在您的方案中可能很重要,因为不使用该功能但包含标头及其声明的转换单元不必提供未使用的定义。


现在让我们检查一下问题:

  • 在头文件中声明静态函数有什么问题?
    这有点不寻常。通常,静态函数是仅在一个文件中需要的函数。它们被声明为静态的,以通过限制其可见性来使其明确。因此,在标头中声明它们有点相反。如果确实在具有相同定义的多个文件中使用了该函数,则应将其设为具有单个定义的外部文件。如果只有一个翻译单元实际使用它,则声明不属于标头。

    因此,一种可能的情况是确保相应翻译单元中不同实现的统一功能签名通用标头会导致C(和C ++)中不同返回类型的编译时错误不同的参数类型仅在C语言中会导致编译时错误(而在C ++中则不会因为函数重载而导致)。
  • 有什么风险?
    我认为您的情况没有风险。(与此相反,在标头中包含函数定义也可能违反封装原理。)
  • 对编译时间有什么影响?
    函数声明很小并且复杂度很低,因此在标头中包含其他函数声明的开销可以忽略不计。但是,如果您在许多翻译单元中为声明创建并包括一个附加的标头,则文件处理开销可能会很大(即,编译器在等待标头I / O时会大量闲置)
  • 运行时有任何风险吗?
    我什么也看不到。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章