gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:45:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com