如何避免C++中两个库的变量/函数冲突

Jyo*_*iff 6 c++ header-files

我有类似的情况,如下所述:

我有一个头文件first.h 它有一个功能:

char* getName();
Run Code Online (Sandbox Code Playgroud)

first.cpp具有函数定义的关联cpp文件

char* getName(){return "first";}
Run Code Online (Sandbox Code Playgroud)

和第二个头文件second.h它具有以下功能:

char* getName();
Run Code Online (Sandbox Code Playgroud)

second.cpp具有功能定义的关联cpp文件

char* getName(){return "second";}
Run Code Online (Sandbox Code Playgroud)

现在有一个main()功能:

#include "first.h"
#include "second.h"

int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我包含这些.h文件时,编译器会在函数中给出错误,getName()因为它是冲突的.

如何在不改变的情况下摆脱这个问题 .h files

Tho*_*ber 5

包含这些头文件时可以使用名称空间:

在你的cpp文件中:

namespace first
{
    #include "first.h"
}

namespace second
{
    #include "second.h"
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下功能:

...
first::getName();
second::getName();
...
Run Code Online (Sandbox Code Playgroud)

编辑:感谢Jens的评论,只有函数是内联的才有效.如果函数不是内联的,并且您实际上无法更改头文件,则可以为这些函数创建"包装器"头文件:

文件包装器 - first.h:

namespace first
{
    char* getName();
}
Run Code Online (Sandbox Code Playgroud)

文件wrapper-first.cpp:

#include "wrapper-first.h"
#include "first.h"

char* first::getName()
{
    return ::getName();
}
Run Code Online (Sandbox Code Playgroud)

...并为第二个头文件创建相同的内容.然后,您只需在您的cpp文件中包含wrpper-include文件,并使用上面的代码.

  • 这仅在函数是内联函数时才有效。如果头文件只是声明函数并链接了实现,则它将不起作用。 (2认同)

MSa*_*ers 3

这会很棘手。两个库都将包含一个getName符号。链接器将getName使用第一个提供该符号的库来解析该符号。无论您如何处理标题,都会发生这种情况。你很幸运,编译器已经抱怨了,并给了你一个明确的错误。

Thomas Barder 的想法将隐藏编译器问题。它不会解决链接器问题。first::getName仍将使用第二个::getName库,反之亦然。

必要的解决方案是拥有first::getName自己库。该库应该仅链接到第一个库。主要可执行文件链接到您的帮助程序库和原始的第二个库。链接器不再有重复的符号,因为它被调用了两次。构建辅助库时,::getName明确来自第一个库。当构建主可执行文件时,它明确来自第二个库。