微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在 Unix 上对串行端口进行编程,并且我正在使用头文件 unistd.h。它包含以下功能

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

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

稍后当开发人员使用我的库时,它会简单而整洁,如下所示:

Serial serial;
serial.read();

我的类名是 Serial 并且包含方法 read(),它本身从 read() 调用函数 unistd.h

解决方法

如果我使用 C++,我可以添加 :: 来解决库冲突。

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

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

,

当我使用 C++ 并从 C 调用函数时如何解决库冲突?

如果您编写 C++,通常会使用带有成员函数的类。并且编译器会发现调用与给定对象相关,因此您不会在该冲突中运行。

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。