问题标签 [header-only]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2051 浏览

c++ - 仅标头库中的静态数据

我正在开发一个仅包含头文件的库。到目前为止,它只包含类,这很好。但是,我已经到了需要在库中拥有一些库范围内可访问的不变数据(即,不是类实例数据)来实现某些功能的地步。您显然不能只将全局数据放在头文件中,否则作为头文件的每个编译单元都#include将具有符号定义,并且您将在链接时遇到多个定义错误。

我似乎找到了一种解决方法,它可以让我在类中拥有静态数据,而无需通过将数据作为static函数中的变量并返回指向该数据的指针来将编译单元添加到库中:

这似乎工作正常,但我必须承认我不知道函数static数据inline在头文件中的函数中会发生什么。我想知道这个“hack”是否有任何意想不到的影响,例如#include这个头文件的每个编译单元都有自己的array. 编译器决定如何以及在哪里放置它?

另外应该注意的是,我没有使用它来实现单例反模式或任何东西。我只是用它来存储多个函数需要使用的数据(这就是为什么它不能static只存在于使用它的函数中,但即使它存在,也会提示同样的问题)。

0 投票
5 回答
49593 浏览

c++ - 仅头文件库的好处

仅标头库有什么好处,为什么要以这种方式编写它而不是将实现放入单独的文件中?

0 投票
1 回答
1400 浏览

c++ - 带有 waf 的 C++ 仅头文件库

美好的一天,在完全迁移到 waf(1.7.5)之前,我尝试创建一个这种结构的简单项目:

这是根wscript

这是application wscript

这是library1 wscript

(注意:我尝试过使用target而不是namefor library1,并且我也尝试过为 启用cxx cxxshlib功能library1。)

这是main.cpp

这是我得到的错误:

我不想改变包含标题的方式,但为此我显然需要改变我的项目设置方式。

我很高兴有任何意见,谢谢。

编辑:已解决,这只是一个错字(inludes而不是includesexport_inludes而不是export_includes)。

0 投票
2 回答
2447 浏览

c++ - 仅包含标头的 C++ 应用程序有什么问题?

我想编写一个只有标题布局的 C++ 应用程序,如下所示:

唯一的 cpp 文件将是主文件。其余代码将放在头文件中。

我想知道这种方法是否存在某种性能问题。我知道在类声明中定义方法会内联它们,但由于它只是一个 cpp 文件,内联方法不会重复。我只想把我的问题集中在表现上。我不是在谈论可扩展性、易读性、维护或其他任何东西。我想知道我是否遗漏了这种方法可能会产生性能问题的东西。

谢谢!

0 投票
0 回答
123 浏览

c++ - 如何从仅标头项目迁移?

我们有一个仅包含标头的 C++ 代码库(VS 2010、Eclipse、Makefile),其中包含大约 450 个文件 (3.6 MB)。由于编译时间长(4 分钟),日常工作开始变得更加困难。其中一小部分(大约 20%)是模板化的,但其他部分是简单的类,到处都有一些模板方法。我们正在考虑迁移 80% 以拥有单独的.cpp.h文件。

首先,我会将每个模板文件从 更改.h.hpp. 这将定义范围。在那之后,我只看到大量的手工工作。也许在 Visual Assist 的Move implementation to source功能的帮助下。最后,我正在考虑部分统一构建(5..20.cpp文件的编译单元),但这可以在所有事情之后完成。

您能想到比手动处理大约 360 个文件更好的方法吗?有加速吗?

0 投票
1 回答
394 浏览

c++ - 可选的仅标头库

我想编写一个 C++ 库,默认情况下它不是仅标头,但可以用作定义NOLIB宏的仅标头库。

我见过两种方法:

  • 内联定义

foo.h

foo.cc


  • “人工”模板

foo.h

foo.cc

这些方法的优缺点是什么?有更好的选择吗?

0 投票
1 回答
257 浏览

c++ - 无法获得仅适用于标头库的警告

我正在创建一个仅限标头的库,并且我希望在编译期间显示它的警告。但是,似乎只显示包括库在内的“主”项目的警告,而不是库本身的警告。

有没有办法强制编译器检查包含库中的警告?

MyHeaderOnlyLib.hpp通过 CMake 脚本查找,使用find_package. 我检查了 CMake 执行的命令,它使用的是-I,而不是-isystem.

我已经尝试过将库包含在<...>(当它在/usr/include/目录中时),或者在本地包含"...".

0 投票
1 回答
1997 浏览

c++ - 仅标头库设计 - 包含指令

我正在创建一个只有头文件的 C++11/14 库,但我不确定应该如何处理#include库文件之间的指令。

我应该尝试#include在面向用户的模块头文件中对尽可能多的指令进行分组,还是内部文件应该包含它们需要的文件(有时重复相同的包含)?


方法一:

在这种方法中,模块头文件包含所有必需的依赖项,然后包含实现。实现的头文件本身不包含任何内容。

-

-

-



方法 B:

在这种方法中,模块头文件仅包含实现头文件。如果实现头文件需要额外的包含,它们会(递归地)包含文件本身,有时会重复相同的包含。

-

-

-


最好的方法是什么?

直觉上,我认为方法 A是最好的,因为它避免重复相同的包含,并明确需要在其他文件之前包含哪些文件。但是,最大的缺点是语法高亮在我的 IDE ( QT-Creator ) 中停止工作,在没有包含指令的实现文件中。


编辑:

由于“基于意见”的原因,该问题被投票关闭。我不同意,因为在像我的包含文件的库这样的大型仅标头项目中,可能需要大量编译时间。因此,方法 A 可能比方法 B 更快,或者相反。

0 投票
7 回答
3942 浏览

c++ - 库设计:允许用户在“仅标题”和动态链接之间做出决定?

我已经创建了几个 C++ 库,它们目前是header-only。我的类的接口和实现都写在同一个.hpp文件中。

我最近开始认为这种设计不是很好:

  1. 如果用户想要编译库并动态链接它,他/她不能。
  2. 更改单行代码需要完全重新编译依赖于库的现有项目。

不过,我真的很喜欢仅标头库的各个方面:所有函​​数都可能被内联,并且它们非常容易包含在您的项目中 - 无需编译/链接任何东西,只需一个简单的#include指令。

有没有可能两全其美?我的意思是 - 允许用户选择他/她想如何使用图书馆。它还将加快开发速度,因为我会在“动态链接模式”下处理库以避免荒谬的编译时间,并以“仅头文件模式”发布我的成品以最大限度地提高性能。

第一个逻辑步骤是在文件中划分接口.hpp和实现。.inl

不过,我不确定如何前进。我已经看到许多库LIBRARY_API在它们的函数/类声明之前添加了宏——也许需要类似的东西来允许用户选择?


我所有的库函数都以inline关键字为前缀,以避免“...的多重定义”错误。我假设关键字将被文件LIBRARY_INLINE中的宏替换.inl?该宏将解析inline为“仅标题模式”,而对于“动态链接模式”则没有。

0 投票
1 回答
32673 浏览

c++ - CMake:当我尝试添加源目录本身或其子目录之一时,target_include_directories() 会打印错误

我正在编写一个 C++ 库(仅标头)并使用 CMake 生成我的(Visual Studio)项目和解决方案文件。我还在编写一个测试套件,它是同一个 CMake 项目的一部分。

当我在代表我的仅标头库的目标上调用 target_include_directories() 时会出现我的问题,以便我的库的使用者可以找到它的头文件。我收到以下错误消息(即使生成未中止)。

(D:/Projects/GPC/Fonts 是我的库项目的顶级目录。顺便说一句,如果我将头文件移动到顶级目录,问题仍然存在。)

我的 CMakeLists.txt 中的违规行是这样的(为简单起见而改编):

我不明白我做错了什么。如果没有 target_include_directories(),消费者项目的代码根本无法包含我的头文件(除非以安装形式,但我还没有做到这一点,无论如何我希望能够从它的构建树中使用我的库,无需安装。)

我觉得我在这里缺少一些基本的东西;但是我已经搜索了几个小时而没有找到解决方案或解释。