我在尝试构建我的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
typedef
为close
所以它会尝试调用TCPclient
成员函数?
一个。那是怎么回事? 和 B.我如何防止这种情况?
如果我注释掉对closesocket
的调用,项目编译正常。
答案 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);