如何在不包含任何文件的情况下从另一个翻译单元访问该功能?

时间:2018-11-20 18:33:27

标签: c++ static-functions

我正在阅读静态函数,据说如果函数是静态的,则只能在同一文件中使用它。经过测试,我意识到这不是真的,因为如果您将文件包含静态函数,您仍然可以在另一个文件中使用该函数。然后,我读到一个说明,您实际上只能在同一翻译单元中使用静态函数。好的,这很有意义,因为它意味着.cpp +包含,但是即使该函数不是静态的,除非包含该文件,否则您仍将无法使用它。那么,如何甚至可以首先从另一个翻译单元访问功能而又不包含任何内容,静态功能的意义何在?

Main.cpp

{repos: map( {(.repo_name): del(.repo_name)} )}

Staticf.h

#include "Staticf.h"

void main()
{
  visible();
}

这可以编译。如果我将该功能设为非静态并删除#include“ Staticf.h”,则无论如何我将无法在Main中使用它。那么,如果您也不能访问非静态功能,为什么还需要静态功能?

2 个答案:

答案 0 :(得分:4)

您可以从其他翻译单元访问非静态功能。您只需要一个前向声明:

somemodule.cpp

void func()
{
  // details
}

main.cpp

void func();

int main()
{
  func();
}

当然,最好将前向声明放在头文件中。

那么静态函数有什么用?

在现代C ++中,它们实际上没有多大用处。 static是C ++继承自C的功能。在C中,声明辅助函数static实际上非常有用,因为C没有命名空间。您可以使用static消除私人助手功能与其他翻译单元中私人助手功能之间名称冲突的可能性。在C ++中,通常首选将私有帮助程序包装在类或匿名名称空间中。

答案 1 :(得分:0)

如果该函数是静态的(就像自由静态函数一样),则不能从另一个翻译单元访问它。

删除static,如果您不能包含标头(虽然您可以...更改前一个静态函数的标头),则在文件中添加一个原型。