c++ - 如何在不包含头文件和重复项的情况下调用 C++ 函数?

标签 c++ call header-files code-duplication

我正在编写 C++ 代码。

从文件 f2.cpp 中,我需要调用 f1.cpp 中定义但未在 f1.h 中删除的函数 f1()。

我不能通过在 f2.cpp 中包含 f1.h 来做到这一点。

我不想定义另一个做同样事情的函数,它是重复的。

如何解决这个问题?

谢谢

已更新

阅读解决方案后,我将在 f1.h 中添加 f1() 的声明。

在f1.h中,它有

namespace name1{
   namespace name2{
      class class1{};
      class class2{};
   }
}

f1() 只是一个实用函数,不涉及 clas1 和 class2 的成员。

目前,f1() 是在 f1.cpp 的命名空间(没有名称)中定义的。

namespace{
  f1(){

  }
}

但是,在 f1.h 中,它有一个命名空间定义 name1 和 name2。

我应该在 f1.h 的什么地方放置 f1() 声明?

现在,我将 f1() 放在 f1.h 的 name1::name2 中,并将 f1.h 包含在 f2.cpp 中,出现链接错误: 从 f2() 取消对 name1::name2::f1() 的保护。

已更新 如果我将 f1() 的声明放在任何命名空间之外的 f1.h 中,并且还包括 f2.cpp 中的 f1.h,我会收到链接错误:f2() 中 f1() 的 undefined symbol ,为什么?

任何帮助将不胜感激!

最佳答案

在f2.cpp中将函数声明为extern

//f2.cpp    
extern void f();   //function declared but defined elsewhere

int main() {    
    f();
}

//f1.cpp
void f() {    
   //function declaration    
}

g++ f2.cpp f1.cpp ,可以正常工作。

话虽如此,您也可以执行 f2.cpp 的 #include,这会起作用,但绝对不是一个好主意,因为如果您同时编译这两个文件,则会出现多重定义错误。如果在您的控制范围内,正确的做法是使用带有函数声明的 f1.h。

更新:对于使用命名空间修改的问题,通过在 f() 周围使用未命名命名空间,您明确告诉编译器将函数的可见性限制为仅该文件。您可以更改为命名空间,然后在头文件中引用其声明

关于c++ - 如何在不包含头文件和重复项的情况下调用 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118091/

相关文章:

c++ - 如何将使用 malloc() 的 C 语句转换为 C++?

c++ - 对象切片时如何生成编译器警告/错误

javascript - 如何获取网页的 JavaScript 调用轨迹?

c++ - C++ 头文件中的 "using namespace"

c++ - 我可以在 Visual C++ 中使用 graph.h、dos.h 和 bios.h 吗?

c++ - 进一步检查 C 头文件

c++ - 将十六进制字符串转换为十六进制值

c++ - 我怎么知道我是否需要删除 C++ 中的某些内容?

JavaScript 在 Internet Explorer 8(和 7)中为 window.print 调用和应用

php - Laravel 中的自定义 setter 和 getter