Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用c++;不包括头文件和副本的功能? 我正在做C++编码。_C++_Call_Header Files_Code Duplication - Fatal编程技术网

如何调用c++;不包括头文件和副本的功能? 我正在做C++编码。

如何调用c++;不包括头文件和副本的功能? 我正在做C++编码。,c++,call,header-files,code-duplication,C++,Call,Header Files,Code Duplication,从文件f2.cpp中,我需要调用在f1.cpp中定义但在f1.h中未删除的函数f1() 我不能通过将f1.h包含在f2.cpp中来实现 我不想定义另一个做同样事情的函数,它是复制 如何解决这个问题 谢谢 已更新 在阅读了解决方案之后,我将在f1.h中添加对f1()的清除 在f1.h中,它具有 namespace name1{ namespace name2{ class class1{}; class class2{}; } } f1()只是一个实用函数,它

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


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

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

如何解决这个问题

谢谢

已更新

在阅读了解决方案之后,我将在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()中取消定义名称1::名称2::f1()

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


任何帮助都将不胜感激

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

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

您想要使用的实用程序函数位于匿名名称空间中,这在概念上类似于
静态
。它使函数仅对该源文件可见

如果不想将函数移出
f1.cpp
,则需要以某种方式将实用程序函数的接口公开。一种方法是将函数移动到具有名称的新名称空间中,例如
f1\u 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.cpp
f2.cpp
包括
util.h

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

// 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
//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()周围使用未命名的名称空间,可以显式地告诉编译器将函数的可见性限制为仅该文件。您可以更改为命名名称空间,然后在头文件中引用其声明“我不能通过将f1.h包含在f2.h中来实现”-为什么?因为它没有在f1.h中声明。一个更好的问题是:为什么不能在f1.h中声明f1?@ThomasDarr我实际上是这个意思。是的。您可以在f2.cpp中重新声明“void f1();”。但是通常你应该把它放到f1.h。你不能在f1.h中声明函数头,然后在f2.cpp中包含f1.h吗?谢谢!f()是在f1.cpp中的命名空间{}中定义的,extern仍然可以这样工作吗?啊,我没有看到命名空间部分,因为您使用的是未命名的命名空间,所以显式地使函数在f1.cpp之外不可见。您可以将它移动到一个命名的名称空间,并从外部引用它,实际上不需要
f
上的
extern
。默认情况下,函数是
extern
。@jayadev,如何将f1()放入带有2个名称空间的g1.h中?目前,f1()仅从f1.cpp调用,更改后,f1()将从f1.cpp和f2.cpp调用,因此f2()(在f2.cpp中)将需要从f2.cpp使用name1::mane2::f1(),对吗?如果我将f1()放在f1.h中,但放在任何名称空间之外,并将f1.h添加到f2.cpp中,会怎么样?这是一个好的解决方案吗?谢谢!但是,f1()是在具有其他函数定义的命名空间中定义的。我不想影响他们。我只需要使f1()可以从f2.cpp调用。@user2420472:您能将其移出到新的命名空间吗?答案已更新。谢谢,我无法创建新文件util.h。如果我在f1.h(有两个名称空间)中加入f1()清除,会有什么影响?就
f1.c
而言,不应该有任何影响。它应该找到函数。但是,明显的影响是,
f1()
变成了一个可以从
f2.c
访问的函数。现在,我将f1()放在f1.h的name1::name2中,并将f1.h包含在f2.cpp中,得到了链接错误:未定义的name1::name2::f1()。任何帮助都将不胜感激!