gpt4 book ai didi

c++ - 与内置函数的命名冲突?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:00 24 4
gpt4 key购买 nike

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

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

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

#define closesocket close 

在我的类(class)代码中,我有:

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

我想发生的事情是 closesockettypedefd as close 所以它会尝试调用 TCPclient成员函数?

一个。是这样吗?和B. 我该如何防止这种情况发生?

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

最佳答案

你有两个问题。

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

#define closesocket close 

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

C++解析器看到的是

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

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

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

第二个问题是关于作用域的,是明显递归调用的原因。您需要告诉编译器您要使用全局 close 函数,这是使用作用域运算符 :: 完成的,如

::close(m_socket);

关于c++ - 与内置函数的命名冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com