在C ++中的名称空间中包含全局函数

时间:2019-07-04 14:06:43

标签: c++

是否有一种方法可以将全局函数(例如,不允许修改代码的库中的函数)包含到命名空间的范围内,并且仍然可以使用它?

我有两个功能:

base64_decode()
base64_encode()

分为两个文件:Base64.cpp Base64.h

(显然)在我的Base64.h名称空间中包含Extensions时,函数声明可用,但是链接器无法找到定义(在Base64.cpp中),因为它们是现在包含在我的命名空间中。示例:

namespace Extensions {
    #include "Base64.h"
}

是否可以在命名空间无需修改原始代码和无需 #include { {1}}?

2 个答案:

答案 0 :(得分:8)

一种常见方式:

#include "Base64.h"

namespace Extensions {

using ::base64_decode;
using ::base64_encode;

}

static_assert(sizeof(&Extensions::base64_decode) > 0, "");
static_assert(sizeof(&Extensions::base64_encode) > 0, "");

答案 1 :(得分:1)

如果您只想将函数放入名称空间,那么Maxim Egorushkin的最佳答案就是解决之道。

但是,有时您需要获取全局名称空间的功能 out (因为它与同名的另一个功能冲突)。在这种情况下,您将不得不使用

namespace Extensions {
    #include "Base64.h"
}

,然后使用特定于平台的技巧在库中重命名符号,以便链接程序可以找到它们。有关Linux,请参见this answer

似乎Windows上所有用于重命名符号的选项都适用于DLL。您将必须弄清楚名称修饰是什么。