包含没有函数的常量

Including constants without functions

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

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

这意味着当我使用 #include<fcntl.h> 时出现了一个不明确的错误。

我希望图书馆尽可能便携。

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

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

is there a better solution?

使用命名空间:

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

需要明确的是,库应该始终在命名空间中声明其 functions/classes/constants/etc...,而不仅仅是作为解决特定问题的手段。这样,您就可以避免与用户可能包含但您看不到的其他库发生潜在冲突。

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

#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);
}