我在做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()的未定义符号,为什么?
任何帮助将不胜感激!
答案 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.cpp
和f2.cpp
都包含util.h
。
答案 2 :(得分:0)
将f1()
的声明放在f2.cpp
中。声明的位置对编译器无关紧要,它只是一种编程约定,声明和定义放在相应的头文件和源文件中。不过,这是一个很好的做法:如果你在f1.cpp
更改一个函数的标题,你只需要在f1.h
更新该声明,你不必在所有的中查找它调用该函数的其他.cpp
个文件。这就是我们首先使用头文件的原因,模块化。
答案 3 :(得分:-1)
为什么不直接包含f1.cpp或在f1.h中声明该函数?