如何调用c++;不包括头文件和副本的功能? 我正在做C++编码。
从文件f2.cpp中,我需要调用在f1.cpp中定义但在f1.h中未删除的函数f1()如何调用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()只是一个实用函数,它
我不能通过将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()。任何帮助都将不胜感激!