问题标签 [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.
c++ - 仅标头库中的静态数据
我正在开发一个仅包含头文件的库。到目前为止,它只包含类,这很好。但是,我已经到了需要在库中拥有一些库范围内可访问的不变数据(即,不是类实例数据)来实现某些功能的地步。您显然不能只将全局数据放在头文件中,否则作为头文件的每个编译单元都#include
将具有符号定义,并且您将在链接时遇到多个定义错误。
我似乎找到了一种解决方法,它可以让我在类中拥有静态数据,而无需通过将数据作为static
函数中的变量并返回指向该数据的指针来将编译单元添加到库中:
这似乎工作正常,但我必须承认我不知道函数static
数据inline
在头文件中的函数中会发生什么。我想知道这个“hack”是否有任何意想不到的影响,例如#include
这个头文件的每个编译单元都有自己的array
. 编译器决定如何以及在哪里放置它?
另外应该注意的是,我没有使用它来实现单例反模式或任何东西。我只是用它来存储多个函数需要使用的数据(这就是为什么它不能static
只存在于使用它的函数中,但即使它存在,也会提示同样的问题)。
c++ - 仅头文件库的好处
仅标头库有什么好处,为什么要以这种方式编写它而不是将实现放入单独的文件中?
c++ - 带有 waf 的 C++ 仅头文件库
美好的一天,在完全迁移到 waf(1.7.5)之前,我尝试创建一个这种结构的简单项目:
这是根wscript
:
这是application
wscript
:
这是library1
wscript
(注意:我尝试过使用target
而不是name
for library1
,并且我也尝试过为 启用cxx cxxshlib
功能library1
。)
这是main.cpp
:
这是我得到的错误:
我不想改变包含标题的方式,但为此我显然需要改变我的项目设置方式。
我很高兴有任何意见,谢谢。
编辑:已解决,这只是一个错字(inludes
而不是includes
和export_inludes
而不是export_includes
)。
c++ - 仅包含标头的 C++ 应用程序有什么问题?
我想编写一个只有标题布局的 C++ 应用程序,如下所示:
唯一的 cpp 文件将是主文件。其余代码将放在头文件中。
我想知道这种方法是否存在某种性能问题。我知道在类声明中定义方法会内联它们,但由于它只是一个 cpp 文件,内联方法不会重复。我只想把我的问题集中在表现上。我不是在谈论可扩展性、易读性、维护或其他任何东西。我想知道我是否遗漏了这种方法可能会产生性能问题的东西。
谢谢!
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 个文件更好的方法吗?有加速吗?
c++ - 可选的仅标头库
我想编写一个 C++ 库,默认情况下它不是仅标头,但可以用作定义NOLIB
宏的仅标头库。
我见过两种方法:
- 内联定义
foo.h
foo.cc
- “人工”模板
foo.h
foo.cc
这些方法的优缺点是什么?有更好的选择吗?
c++ - 无法获得仅适用于标头库的警告
我正在创建一个仅限标头的库,并且我希望在编译期间显示它的警告。但是,似乎只显示包括库在内的“主”项目的警告,而不是库本身的警告。
有没有办法强制编译器检查包含库中的警告?
我MyHeaderOnlyLib.hpp
通过 CMake 脚本查找,使用find_package
. 我检查了 CMake 执行的命令,它使用的是-I
,而不是-isystem
.
我已经尝试过将库包含在<...>
(当它在/usr/include/
目录中时),或者在本地包含"..."
.
c++ - 仅标头库设计 - 包含指令
我正在创建一个只有头文件的 C++11/14 库,但我不确定应该如何处理#include
库文件之间的指令。
我应该尝试#include
在面向用户的模块头文件中对尽可能多的指令进行分组,还是内部文件应该包含它们需要的文件(有时重复相同的包含)?
方法一:
在这种方法中,模块头文件包含所有必需的依赖项,然后包含实现。实现的头文件本身不包含任何内容。
-
-
-
方法 B:
在这种方法中,模块头文件仅包含实现头文件。如果实现头文件需要额外的包含,它们会(递归地)包含文件本身,有时会重复相同的包含。
-
-
-
最好的方法是什么?
直觉上,我认为方法 A是最好的,因为它避免重复相同的包含,并明确需要在其他文件之前包含哪些文件。但是,最大的缺点是语法高亮在我的 IDE ( QT-Creator ) 中停止工作,在没有包含指令的实现文件中。
编辑:
由于“基于意见”的原因,该问题被投票关闭。我不同意,因为在像我的包含文件的库这样的大型仅标头项目中,可能需要大量编译时间。因此,方法 A 可能比方法 B 更快,或者相反。
c++ - 库设计:允许用户在“仅标题”和动态链接之间做出决定?
我已经创建了几个 C++ 库,它们目前是header-only。我的类的接口和实现都写在同一个.hpp
文件中。
我最近开始认为这种设计不是很好:
- 如果用户想要编译库并动态链接它,他/她不能。
- 更改单行代码需要完全重新编译依赖于库的现有项目。
不过,我真的很喜欢仅标头库的各个方面:所有函数都可能被内联,并且它们非常容易包含在您的项目中 - 无需编译/链接任何东西,只需一个简单的#include
指令。
有没有可能两全其美?我的意思是 - 允许用户选择他/她想如何使用图书馆。它还将加快开发速度,因为我会在“动态链接模式”下处理库以避免荒谬的编译时间,并以“仅头文件模式”发布我的成品以最大限度地提高性能。
第一个逻辑步骤是在文件中划分接口.hpp
和实现。.inl
不过,我不确定如何前进。我已经看到许多库LIBRARY_API
在它们的函数/类声明之前添加了宏——也许需要类似的东西来允许用户选择?
我所有的库函数都以inline
关键字为前缀,以避免“...的多重定义”错误。我假设关键字将被文件LIBRARY_INLINE
中的宏替换.inl
?该宏将解析inline
为“仅标题模式”,而对于“动态链接模式”则没有。
c++ - CMake:当我尝试添加源目录本身或其子目录之一时,target_include_directories() 会打印错误
我正在编写一个 C++ 库(仅标头)并使用 CMake 生成我的(Visual Studio)项目和解决方案文件。我还在编写一个测试套件,它是同一个 CMake 项目的一部分。
当我在代表我的仅标头库的目标上调用 target_include_directories() 时会出现我的问题,以便我的库的使用者可以找到它的头文件。我收到以下错误消息(即使生成未中止)。
(D:/Projects/GPC/Fonts 是我的库项目的顶级目录。顺便说一句,如果我将头文件移动到顶级目录,问题仍然存在。)
我的 CMakeLists.txt 中的违规行是这样的(为简单起见而改编):
我不明白我做错了什么。如果没有 target_include_directories(),消费者项目的代码根本无法包含我的头文件(除非以安装形式,但我还没有做到这一点,无论如何我希望能够从它的构建树中使用我的库,无需安装。)
我觉得我在这里缺少一些基本的东西;但是我已经搜索了几个小时而没有找到解决方案或解释。