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

时间:2013-06-14 22:20:25

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

我在做C ++编码。

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

我不能通过在f2.cpp中包含f1.h来实现它。

我不想定义另一个执行相同操作的函数,它是重复的。

如何解决这个问题?

由于

更新

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

在f1.h中,它有

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

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

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

namespace{
  f1(){

  }
}

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

我应该把f1()declearation放在f1.h?

现在,我将f1()放在f1.h的name1 :: name2中,并在f2.cpp中包含f1.h,我收到链接错误: 来自f2()的undefiend name1 :: name2 :: f1()。

已更新 如果我把f1()放在任何命名空间之外的f1.h中,并且还包括来自f2.cpp的f1.h,我得到了链接错误:f2()中f1()的未定义符号,为什么?

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

在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,可以正常工作。

话虽如此,你也可以做一个#include of f2.cpp,这会起作用,但绝对是一个坏主意,因为如果你将两个文件一起编译就会出现多个定义错误。如果在你的控制中,正确的方法是使用函数声明f1.h。

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

中引用它的声明

答案 1 :(得分:1)

您要使用的实用程序函数位于匿名命名空间中,其概念类似于static。它使该功能仅对该源文件可见。

如果您不想将该功能移出f1.cpp,那么您需要以某种方式使效用函数的接口公开。一种方法是将函数移动到具有名称的新命名空间,可能是f1_util。然后,您可以在f1.h中声明效用函数的存在。

// f1.cpp
namespace {
    // move f1() out of this
}
namespace f1_util {
  void f1(){
    //...
  }
}
using namespace f1_util;
//... rest of f1.cpp

// f1.h
namespace f1_util {
    void f1();
}
//... rest of f1.h

最好将实用程序功能移动到新的源文件中,例如util.cpp,并确保它不在匿名命名空间中。然后定义声明它的util.h。然后让f1.cppf2.cpp都包含util.h

答案 2 :(得分:0)

f1()的声明放在f2.cpp中。声明的位置对编译器无关紧要,它只是一种编程约定,声明和定义放在相应的头文件和源文件中。不过,这是一个很好的做法:如果你在f1.cpp更改一个函数的标题,你只需要在f1.h更新该声明,你不必在所有的中查找它调用该函数的其他.cpp个文件。这就是我们首先使用头文件的原因,模块化。

答案 3 :(得分:-1)

为什么不直接包含f1.cpp或在f1.h中声明该函数?