提问人:John Sall 提问时间:1/10/2021 最后编辑:StoryTeller - Unslander MonicaJohn Sall 更新时间:1/10/2021 访问量:1266
如何避免C库中的函数名称冲突?
How to avoid function name conflict in a C library?
问:
我正在Unix上编程串行端口,并且我正在使用头文件。它包含以下功能:unistd.h
read(int fd, void *buf, size_t count)
我正在创建一个类来调用这个函数,我的类中的一个方法也被调用来读取一个字符。但是当我编译时,它说它无法从中识别函数。如果我使用的是 C++,我可以添加以解决库冲突。当我使用 C++ 并调用 C 库函数时,如何解决库冲突?read()
read()
unistd.h
::
后来,当开发人员使用我的库时,它会变得简单整洁,如下所示:
Serial serial;
serial.read();
我的类名是并包含方法,该方法本身从 调用函数。Serial
read()
read()
unistd.h
答:
如果我使用的是 C++,我可以添加以解决库冲突。
::
但是您使用的是 C++。仅仅因为您包含包含 C API 的标头,并不意味着翻译单元不再是 C++ 翻译单元。如果标头被设计为与 C++ 配合使用,那么它的内容仍然放在全局命名空间中(并且可以很好地包含在 C++ 翻译单元中)。unistd.h
这意味着将解析为 声明的 C 库函数。您可以在 .这些是 C++ 编译器的不同函数。只需消除成员函数中的名称的歧义,因为非限定名称查找必须在类范围内找到成员。::read
unistd.h
Serial::read
评论
当我使用 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, 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);
}
评论
::function
my_namespace::function
::read
Serial
Serial::read
::read
serial.read();
不是 C,除非是结构中的函数指针。不要那样标记 Cread
Serial