相关文章推荐
谈吐大方的电脑桌  ·  dotnet 用 ...·  9 月前    · 
坏坏的骆驼  ·  Minecraft ...·  1 年前    · 
灰常酷的书签  ·  java 读取linux文件 ...·  1 年前    · 

开始使用boost::asio库时,编译碰到这个错误提示:

fatal error C1189: #error :  WinSock.h has already been included

查了下抛出这个错误的boost代码,原来是定义了_WINSOCKAPI_,但没有定义_WINSOCK2API_

那哪里定义了_WINSOCKAPI_呢?

后来在网上查了下,原来是我包含了Windows.h头文件,而Windows.h头文件又包含了WinSock.h这个老东西

知道原因就简单了,试了下,方法有三种可解决此错误:

1、在包含Windows.h前定义宏WIN32_LEAN_AND_MEAN,就OK了(WIN32_LEAN_AND_MEAN表示不包含一些极少使用和偏门的资料)

2、在包含Windows.h前包含winsock2.h

3、在包含Windows.h前包含asio.hpp

<br />开始使用boost::asio库时,编译碰到这个错误提示:<br />fatal error C1189: #error :  WinSock.h has already been included<br />查了下抛出这个错误的boost代码,原来是定义了_WINSOCKAPI_,但没有定义_WINSOCK2API_<br />那哪里定义了_WINSOCKAPI_呢?<br />后来在网上查了下,原来是我包含了Windows.h头文件,而Windows.h头文件又包含了WinSock.h这个老 # include # include 编译器会报错,fatal error C1189: #error : WinSock .h has already been include d 解决 办法 #defin 虽然我的情况和上面不太一样,但问题的原因是一样的: 就是有一个包含# include &lt; boost / asio .hpp&gt;的头文件A.h,和一个包含 windows .h的头文件B.h。而B.h在main.cpp的顺序在A.h之前。 调整头文件顺序就好了~
最近在做一项目,使用QT+ boost asio ,编译时出现编译错误: WinSock .h has already been include d,只要把 boost asio 库的包含文件放到QT包含文件之前即可,如原先包含顺序: # include # include # include 即可 解决 问题。
` boost :: asio ::io_service`是 Boost 库中的一个核心类,用于提供异步I/O操作的事件循环机制。它是实现异步网络编程的基础,可用于处理各种网络通信任务。 ` boost :: asio ::io_service`的主要作用是管理和调度异步操作。它负责处理事件循环,监视和分发I/O事件,以及执行注册的回调函数。通过使用`io_service`对象,可以实现非阻塞式的异步I/O编程,提高程序的并发性和响应性。 以下是` boost :: asio ::io_service`类的常见用法示例: ```cpp # include < boost / asio .hpp> void handleRead(const boost ::system::error_code& error, std::size_t bytes_transferred) { if (!error) { // 处理读取数据的回调逻辑 } else { // 处理错误情况 int main() { boost :: asio ::io_service io_service; // 创建一个socket对象 boost :: asio ::ip::tcp::socket socket(io_service); // 连接到服务器 socket.connect(endpoint); // 异步读取数据 boost :: asio ::async_read(socket, boost :: asio ::buffer(buffer), handleRead); // 开始事件循环 io_service.run(); return 0; 在上述示例中,首先创建了一个`io_service`对象,然后创建了一个TCP socket对象,并使用`io_service`对象进行异步读取操作。在`async_read`函数中,指定了一个回调函数`handleRead`,用于处理读取数据完成后的回调逻辑。 最后,通过调用`io_service`的`run()`函数启动事件循环,使程序进入等待事件的状态。在事件循环中,`io_service`会不断地监视和分发I/O事件,并执行注册的回调函数。 使用` boost :: asio ::io_service`,可以方便地实现异步的网络编程,处理各种I/O操作,如读取、写入、连接、接收等。它提供了高度灵活和可扩展的方式来构建异步应用程序。