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