我正在编写 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/