命名冲突。 C ++和OS库(普通C)

时间:2012-11-11 15:14:23

标签: c++ c eclipse g++

我想为Linux Socket API编写一个C ++包装器。我的包装器的方法应该与API的基础函数名称相同。

但是例如在bind()方法中,我使用Linux套接字API中的普通C bind()函数。我调用bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr)),它与API函数的签名兼容。我的编译器抱怨Invalid arguments 'Candidates are: bool bind(int)'这是指我的方法inline bool Socket::bind(int portno)

为什么Eclipse引用了包装器函数?如何禁止Eclipse执行此操作?

2 个答案:

答案 0 :(得分:2)

您必须添加全局范围限定符:

::bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

范围解析确定编译器查找名称的位置。您可以在名称前加上名称空间和/或类范围(例如socket_wrapper::socket::bind())。并且存在全球范围,系统功能通常存在于其中。这些函数可以使用全局范围限定符::bind()作为前缀,因此编译器知道不使用具有相同名称的本地方法。

还有std命名空间,标准库的类和函数位于该命名空间中。如果您想使用标准库,请在std::之前为这些名称添加前缀(例如std::iostream, std::cout, std::string, std::vector<>, ...)。

答案 1 :(得分:0)

请使用名称空间。 明确地!

此外,C调用应该在您的情况下使用:: prefix :: bind引用