如何避免 C 库中的函数名称冲突?

How to avoid function name conflict in a C library?

我正在 Unix 上编写串口,我正在使用头文件 unistd.h。它包含函数:

read(int fd, void *buf, size_t count)

我正在制作一个 class 来调用这个函数,我的 class 中的方法之一也被称为 read() 来读取一个字符。但是当我编译时,它说它无法从 unistd.h 中识别函数 read()。如果我使用的是 C++,我可以只添加 :: 来解决库冲突。当我使用 C++ 并调用 C 库函数时如何解决库冲突?

以后当开发人员使用我的库时,它会像下面这样简单明了:

Serial serial;
serial.read();

我的 class 名称是 Serial 并包含方法 read(),它本身从 unistd.h.

调用函数 read()

If I was using C++, I could just add :: to resolve library conflict.

但是您正在使用C++。仅仅因为您包含一个包含 C API 的 header,并不意味着翻译单元不再是 C++ 翻译单元。如果 header 被设计为与 C++ 兼容,那么它的内容仍然放在全局命名空间中(并且 unistd.h 可以 包含在 C++ 翻译单元中就好了)。

这意味着 ::read 将解析为 unistd.h 声明的 C 库函数。您可以在 Serial::read 内使用它。这些是 C++ 编译器的不同功能。只需消除成员函数内名称的歧义,因为非限定名称查找必须在 class 范围内找到成员。

How to resolve library conflict when I'm using C++ and calling functions from C?

如果您编写 C++,通常将 classes 与成员函数一起使用。并且编译器发现调用与给定对象相关,因此您不会 运行 发生冲突。

如果您使用“自由函数”,您可以给这些函数一个自己的 namespace 并且只需在调用中使用命名空间,例如 serial::read();.

您还可以向 classes 添加静态函数,这将为它们提供命名范围,而无需从 class 本身创建对象。

namespace serial_ns
{
int read( int, void*, size_t n){return 0;}
}

struct serial_struct
{
    static int read( int, void*, size_t n){return 0;}
};

class Serial
{
    public:
        int read( int, void*, size_t n ) { return 0; }
};

int main()
{
    char buf[5];
    read( 0, buf, 5); // call to c-library
    serial_ns::read( 0,buf,5);
    serial_struct::read( 0,buf,5);

    // with an object:
    Serial ser;
    ser.read( 0,buf,5);
}