c++ - 在命名空间中包含实现文件以避免名称冲突

标签 c++ namespaces include

我正在围绕 C 库制作一个 C++ 包装器。假设库(我们称它为 Clib)定义了这样一个函数:

// clib.h
const char* clib_foo(clib_obj_t* obj);

在我的包装器中,我有以下内容:

// clibpp.h
#include <clib.h>

namespace clib {
    std::string_view foo(const clib::obj_t& obj) {
        return clib_foo(obj.raw());
    };
}

// symbols from both clib.h and clibpp.h visible

现在,我的包装器只是 header 。因此,当有人包含 clibpp.h 时,他们会看到来自 clibpp.hclib.h 的符号。我想避免这种情况。我的想法是将 clib.h header 包含在 clibpp.h header 中的命名空间内,以隐藏所有符号。

// clibpp.h
namespace clib {
    namespace detail {
        #include <clib.h>
    }
    std::string_view foo(const clib::obj_t& obj) {
        return detail::clib_foo(obj.raw());
    };
}

// symbols from only clibpp.h visible (apart from preprocessor definitions)

这是个好主意还是可行?为什么似乎没有人这样做?

最佳答案

Is this a good idea or possible to do?

不,这行不通,因为 C 库 - 出于显而易见的原因 - 没有在该命名空间内定义函数等。

Why doesn't anybody seem to do it?

因为它不起作用。


如果您放弃拥有仅包含 header 的包装库的愿望,那么您可以避免“泄漏”C header ,因为您可以仅将其包含在包装库的翻译单元中。

请注意,这仍然不能解决名称冲突的所有问题,因为一个定义规则适用于跨翻译单元边界。如果链接到 C 库,则该库的外部名称不能被其他任何东西使用。隐藏 C header 确实可以防止宏污染。

关于c++ - 在命名空间中包含实现文件以避免名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65935446/

相关文章:

顶部带有 %include 的程序集 - 打印输出意外结果 : just an "S"

c++ - 在事件的主循环中获取 X11 窗口

c++ - 在 C++ 中使用 sscanf 和 sprintf - 风格

c++ - C:数据结构对齐

clojure - 如何在测试期间加载/删除 clojure 中的命名空间

php - MAMP localhost 包含和 cookie 设置功能

c++ - 在指针中存储无符号整数

Javascript 命名空间仅适用于 var

c# - 同一命名空间如何在具有不同项目的单个解决方案中工作

php - 如何使用 .HTACCESS 或其他方法在站点范围内包含 PHP 文件