如何避免 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 明确地来自第一个库。在构建主要可执行文件时,它明确地来自第二个库。