在编译C++一些网络库时,比如Websocket++、Crow等C++ web框架都是基于Asio进行开发的,并且都支持两种Asio。如果定义了ASIO_STANDALONE则会使用Asio,如果未定义则会使用Boost.Asio,那么这两者有什么区别呢?

Asio官网:http://think-async.com/Asio

Boost官网:https://www.boost.org/

在Asio的官网对Asio和Boost.Asio这两个的区别进行了详细的阐述,主要的差异如下。

Asio有两种变体,Asio(非Boost)和Boost.Asio,两者的差异概述如下。

1 源代码有什么区别?

  • Asio主要位于命名空间asio::中,而Boost.Asio则位于boost::asio::中;
  • Asio的主要头文件为asop.hpp,而Boost.Asio对应的头文件为boost/asio.hpp,其他头文件也是类似的变动;
  • Asio使用的宏或者定义宏都以ASIO_开头,而Boost.Asio则以BOOST_ASIO_开头;
  • Asio包含一个用于启动线程的类asio::thread,而Boost.Asio则不包含这个类,避免与Boost.Thread产生重叠和冲突;
  • Boost.Asio 始终使用 Boost.System 库来提供对错误代码 (boost::system::error_codeboost::system::system_error) 的支持。对于 C++11 及更高版本,Asio 使用 编译器附带的std::error_codestd::system_error,Asio 在其自己的命名空间中为这些名称添加别名(asio::error_codeasio::system_error),并且当面向 C++03 时,提供这些类的最小实现。如果以 C++03 为目标很重要,那么值得注意的是,这些类的 Boost.System 版本目前比这个最小实现支持更好的用户定义错误代码可扩展性。
  • 使用Asio只包含头文件即可,不需要链接任何Boost库,当使用C++11版本的编译器,比如支持C++11的gcc、clang或者MSVC时可以考虑使用Asio而不依赖Boost库;Boost.Asio 始终要求您使用 Boost.System 库,如果您想使用boost::thread. 这可能需要链接这些库,但值得注意的是,最新版本的 Boost 允许您在仅标头模式下使用 Boost.System。

2 从哪里下载Asio和Boost.Asio?

可以从SourceForge下载Asio:https://sourceforge.net/projects/asio/files/asio/

Boost.Asio包含在Boost1.35以及更高版本中,Boost可以从Github下载:https://github.com/boostorg/boost,也可以从Boost官网下载:https://www.boost.org/users/history/

3 源代码仓库在哪里?

Asio:https://github.com/chriskohlhoff/asio/

Boost.Asio:https://github.com/boostorg/asio/

4 既然Boost.Asio包含在了Boost中,Asio会停止维护吗?

不会。有一些项目使用 Asio,它们将继续受到支持。

5 我应该使用Asio还是Boost.Asio?

  • 如果你更喜欢仅包含头文件,那么建议使用Asio而不是Boost.Asio
  • 如果你必须使用Boost 1.35之前的版本,那么不包括Boost.Asio,在这种情况下建议使用Asio而不是Boost.Asio
  • Asio和Boost.Asio软件包的新版本更新会比Boost更加频繁和快速,如果你想使用最新版本,那么建议使用Asio而不是Boost.Asio

6 Asio和Boost.Asio可以在同一个程序中共存吗?

可以。

由于它们使用不同的命名空间,因此不应该发生冲突,尽管显然类型本身是不可互换的。(如果您想知道为什么要这样做,请考虑程序正在使用也在内部使用 Asio 的第三方库的情况。)