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

C++ 如何避免C库中的函数名冲突?,c++,name-lookup,C++,Name Lookup,我正在Unix上编程一个串行端口,我正在使用头文件unistd.h。它包含以下功能: read(int fd, void *buf, size_t count) 我正在创建一个类来调用这个函数,我的类中的一个方法也被称为read()来读取一个字符。但是当我编译时,它说它无法从unistd.h中识别函数read()。如果我使用C++,我可以添加::/COM>来解决库冲突。在使用C++和调用C库函数时如何解决库冲突? 稍后,当开发人员使用我的库时,它将简单整洁,如下所示: Serial seria

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

read(int fd, void *buf, size_t count)
我正在创建一个类来调用这个函数,我的类中的一个方法也被称为
read()
来读取一个字符。但是当我编译时,它说它无法从
unistd.h
中识别函数
read()
。如果我使用C++,我可以添加<代码>::/COM>来解决库冲突。在使用C++和调用C库函数时如何解决库冲突? 稍后,当开发人员使用我的库时,它将简单整洁,如下所示:

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

如果我使用C++,我可以添加<代码>::/COM>解决库冲突。< /P>

但你使用的是C++。仅仅因为包含一个包含C API的报头,并不意味着翻译单元停止为C++翻译单元。如果头设计成用C++来播放,那么它的内容仍然放在全局命名空间中(并且<代码> UNSTD .H./C>可以被包含在C++翻译单元中,很好)。 这意味着

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

<如何使用C++和调用C?< /p函数的函数来解决库冲突?

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

如果您使用“自由函数”,您可以给这些函数一个自己的
名称空间
,只需在调用中使用名称空间,如
serial::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);
}

将cpp代码放在命名空间中,这样您就有了
::function
/
my_namespace::function
作为避免歧义的方法。
有什么问题::read
?如果read在类
Serial
中,并且
Serial::read
调用
::read
应该可以,您有什么问题吗?@mpromonet Serial::read calls read read()从unistd
serial.read()read
Serial
结构中的函数指针,否则code>不是C。不要这样标记C很酷,我不知道你可以用这样的C函数添加::,谢谢