gpt4 book ai didi

c - 在 "C"头文件中声明的静态函数

转载 作者:太空狗 更新时间:2023-10-29 16:28:40 44 4
gpt4 key购买 nike

对我来说,在源文件中定义和声明静态函数是一条规则,我指的是 .c 文件。

然而,在极少数情况下,我看到人们在头文件中声明它。由于静态函数有内部链接,我们需要在每个文件中定义它,我们在声明函数的地方包含头文件。这看起来很奇怪,与我们在将某些内容声明为静态时通常想要的相去甚远。

另一方面,如果天真的人试图在没有定义的情况下使用该函数,编译器会提示。所以从某种意义上说,这样做并不是真的不安全,即使听起来很奇怪。

我的问题是:

  • 在头文件中声明静态函数有什么问题?
  • 有哪些风险?
  • 对编译时间有何影响?
  • 运行时有风险吗?

最佳答案

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

some.h:

static void f();
// potentially more declarations

一些.c:

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

如果这是你描述的情况,我对你的评论有异议

Since static functions have internal linkage we need to define it in every file we include the header file where the function is declared.

如果您声明了函数但不在给定的翻译单元中使用它,我认为您不必定义它。 gcc 接受并发出警告;标准似乎并没有禁止它,除非我错过了什么。这在您的场景中可能很重要,因为不使用该函数但包含 header 及其声明的翻译单元不必提供未使用的定义。


现在让我们检查问题:

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

    因此,一种可能的情况是确保在各个翻译单元中为不同的实现 提供统一的函数签名。对于 C(和 C++)中的不同返回类型,公共(public) header 会导致编译时错误; 不同的参数类型只会在 C 中导致编译时错误(但在 C++ 中不会,因为函数重载)。
  • 有哪些风险?
    我看不到您的情况存在风险。 (与在可能违反封装原则的 header 中还包括函数定义相反。)
  • 对编译时间有何影响?
    函数声明很小,复杂性也很低,因此在 header 中添加额外函数声明的开销可以忽略不计。但是,如果您为许多翻译单元中的声明创建并包含一个额外的 header ,文件处理开销可能会很大(即编译器在等待 header I/O 时空闲很多)
  • 运行时是否存在任何风险?
    我看不到任何风险。

关于c - 在 "C"头文件中声明的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056160/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com