【问题标题】:Include global function in namespace in C++在 C++ 命名空间中包含全局函数
【发布时间】:2019-11-15 07:11:13
【问题描述】:

有没有办法将全局函数(比如来自不允许我修改代码的库)包含到命名空间的范围内并且仍然可以使用它?

我有两个功能:

base64_decode()
base64_encode()

在两个文件中:Base64.cppBase64.h。

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

namespace Extensions {
    #include "Base64.h"
}

有没有办法在命名空间内同时实现和声明两个函数无需修改原始代码和无需 #includeing Base64.cpp ?

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果您只想将函数放入命名空间,那么Maxim Egorushkin 的出色答案就是您的最佳选择。

    然而,有时您需要获取全局命名空间的函数out(因为它与另一个同名函数冲突)。在这种情况下,您将不得不使用

    namespace Extensions {
        #include "Base64.h"
    }
    

    然后使用平台特定的技巧来重命名库中的符号,以便链接器可以找到它们。对于 Linux,请参阅 this answer。

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

    【讨论】:

    • @SimonC 接受对对您有帮助的答案。如果您可以在全局命名空间中使用符号,那么请接受 Maxim 的。如果没有,那么我的(或编写您自己的“平台特定黑客”的更多详细信息)。不同的人会有不同的要求,所以多个答案都可以。
    【解决方案2】:

    一种常见的方式:

    #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, "");
    

    【讨论】:

    • 您的编辑回答了我是否可以像使用命名空间的一部分一样使用这些函数的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2013-11-19
    • 2012-11-07
    • 2013-02-22
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多