C++ 如何避免C库中的函数名冲突?
我正在Unix上编程一个串行端口,我正在使用头文件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
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()从unistdserial.read()除非read
是Serial
结构中的函数指针,否则code>不是C。不要这样标记C很酷,我不知道你可以用这样的C函数添加::,谢谢