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

How can you access the function from another translation unit without including any files?

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

Main.cpp

#include "Staticf.h"

void main()
{
  visible();
}

Staticf.h

#pragma once
#include <iostream>
using namespace std;

static void visible()
{
  cout << "Static function is visible\n";
}

编译正常。如果我使该函数成为非静态函数并删除#include "Staticf.h",我将无法在 Main 中使用它。那么,如果您也不能访问非静态函数,为什么还需要静态函数呢?

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

删除static,如果你不能包含header(你可能可以......改变以前的静态函数的header),添加一个原型文件。

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

somemodule.cpp

void func()
{
  // details
}

main.cpp

void func();

int main()
{
  func();
}

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

那么静态函数有什么用呢?

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