Asio和Boost.Asio
Asio有两种变体:(非Boost)Asio和Boost.Asio。下面概述了两者之间的区别。
源代码有什么区别?
-
Asio位于一个名为asio::的命名空间中,而Boost.Asio则将所有内容放在boost::asio::下。
-
Asio的主要头文件被称为asio.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_code和boost::system::system_error)。对于C++11及更高版本,Asio使用随编译器附带的std::error_code和std::system_error类。Asio在其自己的命名空间中为这些名称设置了别名(作为asio::error_code和asio::system_error),并在针对C++03时,提供了这些类的最小实现。如果针对C++03很重要,值得注意的是,Boost.System版本的这些类目前支持用户定义错误代码的更好扩展性,而不是这个最小实现。
-
Asio是仅限头文件的,并且在大多数用途中不需要链接任何Boost库。使用C++11或更高版本与gcc、clang或MSVC的最新版本时,Asio可以在没有任何Boost依赖的情况下使用。Boost.Asio始终要求你使用Boost.System库,并且如果你想使用boost::thread来启动线程,还需要对Boost.Thread进行链接。尽管如此,值得注意的是,最新版本的Boost允许你以仅限头文件的模式使用Boost.System。
我从哪里可以获得发布包?
Asio可以从SourceForge下载,包名为asio-X.Y.Z.tar.gz(或.tar.bz2或.zip)。
Boost.Asio包含在1.35及更高版本的Boost发行版中。它也可以作为一个单独的包在SourceForge上获得,名为boost_asio_X_Y_Z.tar.gz。后者旨在覆盖现有Boost源代码发行版的顶部。
源代码库在哪里? Asio托管在GitHub上。
Boost.Asio被检入Boost的GitHub存储库中。
两个版本是如何维护的? 所有开发都在GitHub上的Asio存储库中进行。源代码定期使用名为boostify.pl的脚本转换为Boost格式,并将更改合并到Boost的GitHub存储库中。
现在Boost.Asio已经包含在Boost中,Asio是否会停止? 不会。有项目在使用Asio,它们将继续得到支持。
我应该使用Asio还是Boost.Asio?
这取决于。这里有一些需要考虑的事情:
-
如果你更喜欢仅限头文件的库的便利性,那么建议使用Asio而不是Boost.Asio。
-
如果你必须使用早于1.35的Boost版本,那么Boost.Asio不包括在内。你可以通过将其覆盖到你的Boost发行版(见上文)顶部来使用Boost.Asio,但并非每个人都乐于这样做。在这种情况下,建议使用Asio而不是Boost.Asio。
-
Asio和Boost.Asio的新版本将以比Boost更快的发布周期创建。如果你想使用最新功能,你仍然可以使用Boost.Asio,只要你愿意将其覆盖到你的Boost发行版顶部。如果你不想这样做,使用Asio而不是Boost.Asio。
Asio和Boost.Asio可以在同一个程序中共存吗?
可以。由于它们使用不同的命名空间,因此不应该有冲突,尽管显然这些类型本身是不可互换的。(如果你想知道为什么要这样做,请考虑一个程序正在使用也在内部使用Asio的第三方库的情况。)