如何避免 C 库中的函数名称冲突?
How to avoid function name conflict in a C library?
我正在 Unix 上编写串口,我正在使用头文件 unistd.h
。它包含函数:
read(int fd, void *buf, size_t count)
我正在制作一个 class 来调用这个函数,我的 class 中的方法之一也被称为 read()
来读取一个字符。但是当我编译时,它说它无法从 unistd.h
中识别函数 read()
。如果我使用的是 C++,我可以只添加 ::
来解决库冲突。当我使用 C++ 并调用 C 库函数时如何解决库冲突?
以后当开发人员使用我的库时,它会像下面这样简单明了:
Serial serial;
serial.read();
我的 class 名称是 Serial
并包含方法 read()
,它本身从 unistd.h
.
调用函数 read()
If I was using C++, I could just add ::
to resolve library conflict.
但是您正在使用C++。仅仅因为您包含一个包含 C API 的 header,并不意味着翻译单元不再是 C++ 翻译单元。如果 header 被设计为与 C++ 兼容,那么它的内容仍然放在全局命名空间中(并且 unistd.h
可以 包含在 C++ 翻译单元中就好了)。
这意味着 ::read
将解析为 unistd.h
声明的 C 库函数。您可以在 Serial::read
内使用它。这些是 C++ 编译器的不同功能。只需消除成员函数内名称的歧义,因为非限定名称查找必须在 class 范围内找到成员。
How to resolve library conflict when I'm using C++ and calling functions from C?
如果您编写 C++,通常将 classes 与成员函数一起使用。并且编译器发现调用与给定对象相关,因此您不会 运行 发生冲突。
如果您使用“自由函数”,您可以给这些函数一个自己的 namespace
并且只需在调用中使用命名空间,例如 serial::read();
.
您还可以向 classes 添加静态函数,这将为它们提供命名范围,而无需从 class 本身创建对象。
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);
}
我正在 Unix 上编写串口,我正在使用头文件 unistd.h
。它包含函数:
read(int fd, void *buf, size_t count)
我正在制作一个 class 来调用这个函数,我的 class 中的方法之一也被称为 read()
来读取一个字符。但是当我编译时,它说它无法从 unistd.h
中识别函数 read()
。如果我使用的是 C++,我可以只添加 ::
来解决库冲突。当我使用 C++ 并调用 C 库函数时如何解决库冲突?
以后当开发人员使用我的库时,它会像下面这样简单明了:
Serial serial;
serial.read();
我的 class 名称是 Serial
并包含方法 read()
,它本身从 unistd.h
.
read()
If I was using C++, I could just add
::
to resolve library conflict.
但是您正在使用C++。仅仅因为您包含一个包含 C API 的 header,并不意味着翻译单元不再是 C++ 翻译单元。如果 header 被设计为与 C++ 兼容,那么它的内容仍然放在全局命名空间中(并且 unistd.h
可以 包含在 C++ 翻译单元中就好了)。
这意味着 ::read
将解析为 unistd.h
声明的 C 库函数。您可以在 Serial::read
内使用它。这些是 C++ 编译器的不同功能。只需消除成员函数内名称的歧义,因为非限定名称查找必须在 class 范围内找到成员。
How to resolve library conflict when I'm using C++ and calling functions from C?
如果您编写 C++,通常将 classes 与成员函数一起使用。并且编译器发现调用与给定对象相关,因此您不会 运行 发生冲突。
如果您使用“自由函数”,您可以给这些函数一个自己的 namespace
并且只需在调用中使用命名空间,例如 serial::read();
.
您还可以向 classes 添加静态函数,这将为它们提供命名范围,而无需从 class 本身创建对象。
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);
}