是否有一种方法可以将全局函数(例如,不允许修改代码的库中的函数)包含到命名空间的范围内,并且仍然可以使用它?
我有两个功能:
base64_decode()
base64_encode()
分为两个文件:Base64.cpp
Base64.h
。
(显然)在我的Base64.h
名称空间中包含Extensions
时,函数声明可用,但是链接器无法找到定义(在Base64.cpp
中),因为它们是现在包含在我的命名空间中。示例:
namespace Extensions {
#include "Base64.h"
}
是否可以在命名空间无需修改原始代码和无需 #include
{ {1}}?
答案 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。您将必须弄清楚名称修饰是什么。