C/C : 头文件中的静态函数,是什么意思?

新手上路,请多包涵

我知道在源文件中声明静态函数意味着什么。我正在阅读一些代码,发现头文件中的静态函数可以在其他文件中调用。

原文由 Jarod 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

函数是否定义在头文件中?以便在函数中直接给出实际代码,如下所示:

 static int addTwo(int x)
{
  return x + 2;
}

那么这只是为许多不同的 C 文件提供有用功能的一种方式。每个包含头文件的 C 文件都将获得它自己可以调用的定义。这当然会浪费内存,并且(在我看来)是一件非常丑陋的事情,因为在标头中包含可执行代码通常不是一个好主意。

请记住 #include : 头文件基本上只是将头文件的内容(以及它包含的任何其他头文件)粘贴到编译器看到的 C 文件中。编译器永远不知道一个特定的函数定义来自头文件。

更新:在许多情况下,执行上述操作实际上是一个好主意,我意识到我的回答听起来很黑白,这有点过于简单化了。例如,建模(或仅使用) 内在函数 的代码可以像上面那样表达,并且使用显式的 inline 关键字 even:

 static inline int addTwo(int *x)
{
  __add_two_superquickly(x);
}

在这里, __add_two_superquickly() 函数是一个虚构的内在函数,由于我们希望整个函数基本上编译成一条指令,我们真的希望它被内联。不过,上面的内容比使用宏更干净。

与直接使用内在函数相比的优势当然是,通过提供替代实现并根据正在使用的编译器选择正确的实现,将其包装在另一层抽象中可以在缺乏特定内在函数的编译器上构建代码.

原文由 unwind 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您在头文件中定义函数(而不是简单地声明它),则会在每个翻译单元中生成该函数的副本(基本上在每个包含此头文件的 cpp 文件中)。

这可能会增加可执行文件的大小,但如果函数很小,这可能可以忽略不计。优点是大多数编译器可以内联函数,这可能会提高代码性能。

但是这样做可能会有 很大 的不同,这在任何答案中都没有提到。如果您的函数使用静态局部变量,例如:

 static int counter()
{
    static int ctr = 0;
    return ctr++;
}

而不是:

 //header
int counter();

//source
int counter()
{
    static int ctr = 0;
    return ctr++;
}

然后每个包含这个头文件的源文件都会有自己的计数器。如果函数在头文件中声明,并在源文件中定义,那么计数器将在整个程序中共享。

所以说唯一的区别是性能和代码大小是错误的。

原文由 galinette 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题