如何避免 C++ 中两个库的 variable/function 冲突
How to avoid variable/function conflicts from two libraries in C++
我有类似的情况,如下所述:
我有一个头文件first.h
它有一个功能:
char* getName();
和关联的 cpp 文件 first.cpp
具有函数定义
char* getName(){return "first";}
和第二个头文件second.h
它具有以下功能:
char* getName();
关联cpp文件second.cpp
有函数定义
char* getName(){return "second";}
现在有一个main()
函数:
#include "first.h"
#include "second.h"
int main(){
return 0;
}
当我包含那些 .h
文件时,编译器在函数 getName()
处给出错误,因为它存在冲突。
如何在不改变的情况下摆脱这个问题.h files
您可以在包含这些头文件时使用命名空间:
在您的 cpp 文件中:
namespace first
{
#include "first.h"
}
namespace second
{
#include "second.h"
}
那么您可以使用以下功能:
...
first::getName();
second::getName();
...
编辑: 感谢 Jens 的评论,这仅在函数内联时有效。如果函数不是内联的并且您确实无法更改头文件,您可以为这些函数创建 "wrapper" 个头文件:
文件包装器-first.h:
namespace first
{
char* getName();
}
文件包装器-first.cpp:
#include "wrapper-first.h"
#include "first.h"
char* first::getName()
{
return ::getName();
}
...并为第二个头文件创建相同的文件。然后你只需在你的 cpp 文件中包含 wrpper-include 文件并使用上面的代码。
这会很棘手。 两个 库都将包含一个getName
符号。 linker 将使用提供它的第一个库解析 getName
符号。 无论 您对 headers 做了什么,都会发生这种情况。你很幸运,编译器已经报错,并给了你一个明确的错误。
Thomas Barder 的想法将隐藏编译器问题。它不会 解决linker 问题。 first::getName
仍将使用 second 库中的 ::getName
,反之亦然。
必要的解决方案是在其 自己的 库中包含 first::getName
。该库应该 link 仅针对第一个库。针对您的帮助程序库和原始第二个库的主要可执行文件 links。 linker 不再有重复的符号,因为它被调用了两次。在构建辅助库时,::getName
明确地来自第一个库。在构建主要可执行文件时,它明确地来自第二个库。
我有类似的情况,如下所述:
我有一个头文件first.h
它有一个功能:
char* getName();
和关联的 cpp 文件 first.cpp
具有函数定义
char* getName(){return "first";}
和第二个头文件second.h 它具有以下功能:
char* getName();
关联cpp文件second.cpp
有函数定义
char* getName(){return "second";}
现在有一个main()
函数:
#include "first.h"
#include "second.h"
int main(){
return 0;
}
当我包含那些 .h
文件时,编译器在函数 getName()
处给出错误,因为它存在冲突。
如何在不改变的情况下摆脱这个问题.h files
您可以在包含这些头文件时使用命名空间:
在您的 cpp 文件中:
namespace first
{
#include "first.h"
}
namespace second
{
#include "second.h"
}
那么您可以使用以下功能:
...
first::getName();
second::getName();
...
编辑: 感谢 Jens 的评论,这仅在函数内联时有效。如果函数不是内联的并且您确实无法更改头文件,您可以为这些函数创建 "wrapper" 个头文件:
文件包装器-first.h:
namespace first
{
char* getName();
}
文件包装器-first.cpp:
#include "wrapper-first.h"
#include "first.h"
char* first::getName()
{
return ::getName();
}
...并为第二个头文件创建相同的文件。然后你只需在你的 cpp 文件中包含 wrpper-include 文件并使用上面的代码。
这会很棘手。 两个 库都将包含一个getName
符号。 linker 将使用提供它的第一个库解析 getName
符号。 无论 您对 headers 做了什么,都会发生这种情况。你很幸运,编译器已经报错,并给了你一个明确的错误。
Thomas Barder 的想法将隐藏编译器问题。它不会 解决linker 问题。 first::getName
仍将使用 second 库中的 ::getName
,反之亦然。
必要的解决方案是在其 自己的 库中包含 first::getName
。该库应该 link 仅针对第一个库。针对您的帮助程序库和原始第二个库的主要可执行文件 links。 linker 不再有重复的符号,因为它被调用了两次。在构建辅助库时,::getName
明确地来自第一个库。在构建主要可执行文件时,它明确地来自第二个库。