c++中的header-only library

不同于在java中,虽然在java中,有些第三方库只是做了桥接的功能,比如slf4j-log4j-api,但是在运行时他们仍然是需要的,所以最多只能说是松耦合做得很好。

但是在c++中,一般我们应用第三方库的时候,是头文件+库(lib/a或so/dll)配对的形式。除此之外,c++中,还有一种称之为header only library的三方库,比如RapidJson、Boost.Asio。

关于什么是header-only library的定义,笔者特地搜了下其定义:就C/C++编程语言而言,当编译器可以通过头文件得到一个库包含的所有宏、函数、类的完整定义时,我们称这个库是header-only的。简而言之(会不会全部inline了?),Header-only库不需要单独的编译、打包和安装。只需要告诉编译器头文件的位置、并在应用源代码中#include头文件即可。

就模板而言,因为编译器需要知道模板的完整定义才能实例化,所以必须在头文件中包含完整定义。

所以这个其实header-only的思想应该来说是跟java的分发更加的接近了。任何时候要么源码、要么拿到编译好的jar文件即可。而不需要编译时候需要header,链接时候需要dll/lib。

https://en.wikipedia.org/wiki/Header-only

时间: 2024-12-19 23:14:22

c++中的header-only library的相关文章

【转】Header Only Library的介绍

什么是Header Only Library Header Only Library把一个库的内容完全写在头文件中,不带任何cpp文件. 这是一个巧合,决不是C++的原始设计. 第一次这么做估计是STL.在80年代末C++编译器还不支持模块分离(现在也不支持,以后估计也不会支持了), STL的作者不得不把模板的实现写在头文件中, 使得一个STL库的实现绝大部分都展示给了使用者. 第一次广泛被接受估计还是在Boost库,它不只提出使用hpp做为Header Only Library的文件后缀(因为

Mac 中显示资源库(Library)文件夹目录的几种方法

Mac 中显示资源库(Library)文件夹目录的几种方法 Mac中Library目录在10.6.7系统之后默认隐藏的,要想找到此文件夹有如下几种方法: 1. 用命令可以使其显示: 在终端中执行命令: chflags nohidden ~/Library 可显示资源库文件夹 如想隐藏,可以在终端中执行命令: chflags hidden ~/Library 隐藏 2. 在Finder菜单中的偏好设置中设置 在Finder菜单中的偏好设置中选择边栏,勾选上设备中的硬盘. 再打开Finder,Fin

怎样在UICollectionView中添加Header和footer

---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-http://www.appcoda.com/supplementary-view-uicollectionview-flow-layout/ iOS UICollectionViewController 目录[-] Tweak the Margin of Your Content using Secti

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中,选择collection view controller中的"Collection View".在Attributes inspector中,选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示: 最重要的是,我们必须为header和footer view指定一个标识符.这个标示符将会被用于代码识别图片名称.在Atteributes inspector中设置hea

在fetch方法中添加header后遇到的预检请求问题

今天在使用fetch方法 fetch('xxx.com',{header:{bbbbbbb:111}}) 浏览器返回的请求信息中,header变成了 :authority:koss.nocorp.me :method:OPTIONS :path:/?a=1 :scheme:https accept:*/* accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.8 access-control-request-headers:

斐迅面试记录—Http协议中的Header

HTTP Request的Header信息 1.HTTP请求方式 如下表: 说明: 主要使用到"GET"和"POST". 实例: POST /test/tupian/cm HTTP/1.1 分成三部分: (1)POST:HTTP请求方式 (2)/test/tupian/cm:请求Web服务器的目录地址(或者指令) (3)HTTP/1.1: URI(Uniform Resource Identifier,统一资源标识符)及其版本   2.Host 说明: 请求的web

[小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证

在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读取证书的相关信息,然后在发送 HTTP 登录请求时顺便在 Header 字段附加上身份信息.服务器端处理这样的登录请求的思路也很简单,就是读取 HTTP Header 相关信息,然后进行相应的处理. 在 ASP.Net MVC 架构的网站中,自然也可以使用这样的机制,下面基于 Visual Studio 2012 演示一下操作步骤. 首先建立一个ASP.Net MVC 4 项目. 选择模板的时候,保留默

MyEclipse中关于JRE System Library、Web App Libraries的疑惑

简要说明一下:其实,这三个都是jar包的存放集合. 1.JRE System Library主要存放J2SE的标准jar,一般不需要调整. 2.Referenced Libraries是存放第三方的jar包,也就是自己导入的jar包.在项目属性的Java Build Path中的Libraries中配置.本人理解,这里导入和配置jar包,都是为了让web工程能够在eclipse开发环境可以正常编译,不报错而已,如果该web工程利用Myeclipse生成war包,是不会导出其jar包到WEB-IN

PHP中如何Header出状态代码 (转)

---恢复内容开始--- 在照彭武兴先生的<PHP(PHP培训 php教程 ) BIBLE>中所述,header可以送出Status标头,如 header("Status: 404 Not Found"); ?> 就可以让用户浏览器出现文件找不到的404错误,但是我试了这样是不行的. 后来我到w3.org上查了http的相关资料,终于试出来了如何Header出状态代码(Status),与大家分享. 其实应该是这样的: Header("http/1.1 403

CI3中添加自己的library,并且使用CI的特性

CI可以很方便的扩展自己的类,但是当我们扩展自己类的时候,很多时候会调用CI中的其他特性,那么需要使用get_instance来达到我们想要的效果 1.在application\controllers\User.php中,调用了自己写的一个类theme <?php defined('BASEPATH') OR exit('No direct script access allowed'); class User extends BaseController{ public function __