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

How to avoid function name conflict in a C library?

提问人:John Sall 提问时间:1/10/2021 最后编辑:StoryTeller - Unslander MonicaJohn Sall 更新时间:1/10/2021 访问量:1266

问:

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

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

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

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

Serial serial;
serial.read();

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

C++ 名称查找

评论

3赞 Jarod42 1/10/2021
将 cpp 代码放在命名空间中,这样您就可以使用 / 来避免歧义。::functionmy_namespace::function
4赞 Artyer 1/10/2021
怎么了?::read
0赞 mpromonet 1/10/2021
如果读在类中,并调用它应该没问题,你的问题是什么?SerialSerial::read::read
0赞 John Sall 1/10/2021
@mpromonet Serial::read 从 unistd 调用 read()
0赞 phuclv 1/10/2021
serial.read();不是 C,除非是结构中的函数指针。不要那样标记 CreadSerial

答:

6赞 StoryTeller - Unslander Monica 1/10/2021 #1

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

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

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

评论

0赞 John Sall 1/10/2021
很酷,我不知道你可以用这样的 c 函数添加 :: 谢谢
1赞 Klaus 1/10/2021 #2

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

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

如果您使用“免费函数”,则可以为这些函数提供自己的函数,只需在调用中使用命名空间即可,例如 .namespaceserial::read();

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

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