0

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

主文件

#include "Staticf.h"

void main()
{
  visible();
}

静态文件.h

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

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

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

4

2 回答 2

5

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

一些模块.cpp

void func()
{
  // details
}

主文件

void func();

int main()
{
  func();
}

当然,将前向声明放在头文件中是一种最佳实践。

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

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

于 2018-11-20T18:42:35.737 回答
0

如果函数是静态的(就像免费的静态函数一样),您无法从另一个翻译单元访问它。

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

于 2018-11-20T18:35:36.407 回答