与内置函数的命名冲突? 我试图在构建C++项目时出错。

与内置函数的命名冲突? 我试图在构建C++项目时出错。,c++,C++,我正在尝试构建一个涉及套接字的跨平台项目。在Windows上,当套接字关闭时,我需要调用closesocket,而在linux上,我只需要调用close 因此,为了实现跨平台解决方案,我在基类中定义了以下内容: #define closesocket close 在我的课程代码中,我有: class TCPClient { void TCPClient::close() { closesocket(m_socket); } } 但是,我现在在尝试构建

我正在尝试构建一个涉及套接字的跨平台项目。在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
typedef
d作为
close
,所以它尝试调用
TCPclient
成员函数

这就是正在发生的事情吗? 及 我该如何防止这种情况

如果我注释掉对
closesocket

的调用,则项目编译良好。您有两个问题

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

#define closesocket close 

C++分析器所见的是

void TCPClient::close()
{
    close(m_socket);
}
也就是说,尝试递归调用
TCPClient::close
,但传递函数不接受的参数

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

第二个问题是关于作用域的,这是显然是递归调用的原因。您需要告诉编译器您想要使用全局
close
函数,这是使用作用域操作符
完成的,如中所示

::close(m_socket);

我会定义一个包装函数,而不是使用一个
#define
宏:
intclosesocket(intfd){return::close(fd);}
@RemyLebeau,它不会解决宏所做的平台差异。@Startec实际上,它会这样做,并且以一种比宏更安全的方式?
closesocket
是否会覆盖内置的windows函数,并且此函数体中对
return::close
的调用似乎仍然无法调用windows函数
closesocket
::close(m_socket);