如何解决如何避免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 举报,一经查实,本站将立刻删除。