【问题标题】:Including constants without functions包括没有函数的常量
【发布时间】:2021-10-18 17:13:44
【问题描述】:

我正在制作一个 c++ 库,我想在标题中包含 fcntl.h(用于权限常量)

但我有一个名为 open 的函数,参数列表包含可以转换为 fcntl 的开放参数列表类型的类。

这意味着当我使用 #include<fcntl.h> 时,我遇到了一个模棱两可的错误。

我希望库尽可能地便携。

我想将名称从 open 更改为 Open,但有更好的解决方案吗?

就像在不解析函数的情况下包含标题(例如,只包含常量)。

【问题讨论】:

    标签: c++ constants ambiguous


    【解决方案1】:

    有没有更好的解决方案?

    使用命名空间:

    namespace my_lib {
      int open(const char *pathname, int flags);
    }
    

    需要明确的是,库应始终在命名空间中声明其函数/类/常量/等...,而不仅仅是解决特定问题的一种手段。这样,您就可以避免与用户可能包含的其他库发生潜在冲突,而您不知道这些库。

    编辑:从评论中的后续内容来看,如果使用命名空间作为前缀变得烦人,您可以在本地使用命名空间中的单个标识符,这不会有歧义,也不会导致冲突代码中的其他地方。

    #include <fcntl.h>
    
    namespace my_lib {
        int open(const char *pathname, int flags);
    }
    
    void foo() {
        using my_lib::open;
        
        open("aaa", 0);
    }
    

    您应该永远不要求助于using namespace my_lib。但是,如果您被画在角落里(例如,using namespace 在您无法更改的代码中),您可以通过显式引用不明确符号的命名空间来解决冲突。

    #include <fcntl.h>
    
    namespace my_lib {
        void bar();
        int open(const char *pathname, int flags);
    }
    
    using namespace my_lib;
    
    void foo() {
        bar();
    
        // use the open() from fcntl.h
        ::open("aaa", 0);
    
        // Use the open() from my_lib
        ::my_lib::open("aaa", 0);
    }
    

    【讨论】:

    • 我是,问题出现在我使用 using namespace xxx;在一个程序中。我也希望能够做到这一点。那是因为我想在未来将它升级为一个框架
    • @VBrawl 这正是为什么这么多人一直说永远不要使用using namespace xxx; 的原因。停止使用它,您的问题就会消失。
    • 是的,但是我打算用这个库做一个框架,所以很难继续使用 XXX::open 或任何其他函数
    • @Vbrawl 在这种情况下,您可以使用本地命名空间,如下所示:gcc.godbolt.org/z/8TEK9a8cv
    • 编辑很有用,是否可以将 fcntl 包含在自定义命名空间中?如果没有,我将使用您的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多