使用内置函数命名冲突?

时间:2017-10-24 23:53:05

标签: c++

我在尝试构建我的C ++项目时遇到错误。

我正在尝试构建一个涉及套接字的跨平台项目。在Windows上我需要在套接字关闭时调用closesocket,在linux上我只需要调用close。

因此,为了制作跨平台解决方案,我在我的基类中定义了以下内容:

#define closesocket close 

在我的课程代码中,我有:

class TCPClient {
    void TCPClient::close()
    {
        closesocket(m_socket);
    }
}

但是,当我尝试构建时,我现在收到以下错误:

projects/cpp_sockets/src/project/tcp_client.cpp: In member function ‘void TCPClient::close()’:                                                                                                                        
/home/optonox/Documents/projects/cpp_sockets/src/project/tcp_client.cpp:44:22: error: no matching function for call to                                                                                                                        
 ‘TCPClient::close(SOCKET&)’                                                                                                                                                                                                                  
  closesocket(m_socket);  


                  ^                                                                                                                                                                                                                    /home/optonox/Documents/projects/cpp_sockets/src/project/tcp_client.cpp:42:6: note: candidate: void TCPClient::close()                                                                                                                        
 void TCPClient::close()                                                                                                                                                                                                                      
      ^~~~~~~~~                                                                                                                                                                                                                               
/home/optonox/Documents/projects/cpp_sockets/src/project/tcp_client.cpp:42:6: note:   candidate expects 0 arguments, 1                                                                                                                        
 provided                                                                                                                                                                                                                                     
src/project/CMakeFiles/cpp_sockets.dir/build.make:110: recipe for target 'src/project/CMakeFiles/cpp_sockets.dir/tcp_c  

我猜是发生了什么closesocket typedefclose所以它会尝试调用TCPclient成员函数?

一个。那是怎么回事? 和 B.我如何防止这种情况?

如果我注释掉对closesocket的调用,项目编译正常。

1 个答案:

答案 0 :(得分:5)

您有两个问题。

第一个是预处理器的工作原理,它在实际的C ++解析器看到代码之前替换宏调用。这意味着

#define closesocket close 

void TCPClient::close()
{
    closesocket(m_socket);
}

C ++解析器看到的是

void TCPClient::close()
{
    close(m_socket);
}

也就是说,尝试递归调用TCPClient::close ,但传递函数不会参数。

第一个问题的解决方案是尽量避免使用宏,而是直接在TCPClient::close函数中使用conditional compilation

第二个问题是关于范围界定并且是明显递归调用的原因。您需要告诉编译器您要使用全局close函数,该函数使用scope-operator ::完成,如

::close(m_socket);