【问题标题】:How can you access the function from another translation unit without including any files?如何在不包含任何文件的情况下从另一个翻译单元访问该功能?
【发布时间】:2018-11-20 18:33:26
【问题描述】:

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

Main.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 中使用它。那么,如果您也不能访问非静态函数,为什么还需要静态函数呢?

【问题讨论】:

  • 如果包含某些东西,包含的文件和包含它的文件是同一个文件。
  • 是的,我知道,这不是问题
  • 打电话给不知道地址、姓名和电话号码的人有什么意义?
  • #include &lt;iostream&gt; using namespace std;是你可以在头文件中采用的最糟糕的路径。
  • FWIW,这是对 C 的保留。在 C++ 中,如果要隐藏函数,可以使用命名空间。

标签: c++ static-functions


【解决方案1】:

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

somemodule.cpp

void func()
{
  // details
}

ma​​in.cpp

void func();

int main()
{
  func();
}

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

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

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

【讨论】:

  • 您可以在 C++ 部分提及 OOP =)
  • 谢谢,我测试了它,这回答了我的问题。我没有考虑前向声明
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2018-01-13
    • 2019-01-04
    • 2020-02-29
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多