问题标签 [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 投票
1 回答
354 浏览

c++ - 在仅标头库中隐藏实现

我尝试使用实现命名空间,但是当我“使用命名空间”时,它会拉入整个实现命名空间,使其无用。

有没有办法隐藏实现,而不需要在使用任何实现之前使用“实现::”?

0 投票
1 回答
1483 浏览

c++ - gcov 报告仅标头类的错误结果

之前已经有很多类似的问题问了:

仅举几例。然而,他们都没有帮助我解决我自己的问题。

我正在使用gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)编译我的源代码

然后我在我的一个源文件上运行gcov (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4

此文件包含仅标头类的单元测试。gcov 成功生成了这个头文件的覆盖信息:

但是,myclass.h.gcov中的结果是错误的。对于大多数行 gcov 报告它们不包含可执行代码。对于它检测为可执行的那些,它主要报告它们尚未被执行。但我确信它们正在被执行(我在调试期间验证了它,一些单元测试由于错误等而失败)。不涉及模板。因此我猜由于某种原因 gcov 无法检测到正确的执行。从我上面的命令行参数可以看出:优化已关闭,内联已关闭...

任何想法还有什么可能导致这些问题?

0 投票
0 回答
1112 浏览

c++ - 在 C++ 中构建单文件/仅标头库

在 C++ 中构造单文件/仅标头库是否被认为是一种好的做法,以便它们有条件地成为标头或实现?例如,

因此,该库的用户将#define LIBRARY_IMPLEMENTATION在单个实现文件中使用一个,以避免多个定义 #include "Library.hpp"

我已经看到 C 库中使用了这种策略(想到了STB ),但我想知道这是否会被认为在现代 C++ 中是惯用的(或者是否有更好的策略来创建单文件/仅标题库)。

0 投票
1 回答
1902 浏览

c++ - 包含包含 stb_image.h 的文件时出现重复符号错误

在我的 main.h 文件中,我#include "skybox.h". 在 skybox.h 中,包含 stb_image.h(来自 GitHub 的最新版本,截至 2017 年 1 月 29 日)。与我遇到的任何其他库不同,在包含 stb_image.h 之前,文档对#define STB_IMAGE_IMPLEMENTATION. 我曾尝试在包含 stb_image.h(在 skybox.h 中)之前、在包含 skybox.h(在 main.h 中)之前将其放入,两者都没有。它们都不起作用,链接器输出 build/main.o 和 build/skybox.o 之间的所有重复项。

ld:架构 x86_64 的 33 个重复符号

是链接时给出的错误。另外,我正在从头文件 stb_image.h 中执行#define,但尝试从源文件中执行此操作,但没有帮助。

0 投票
2 回答
1932 浏览

c++ - 为什么 Boost.ProgramOptions 不是仅标头?

一些 boost 库仅是标头,有些则不是,以及出于各种原因等。

是否有特定的原因/设计决定为什么Boost.ProgramOptions不是仅标题?

我想知道,因为它在其文档中声称是一个“小型”库,我没有看到任何与系统相关的原因(如线程或 asio)。

0 投票
1 回答
7371 浏览

c++ - 双重包含和仅标题库 stbi_image

我有一个 main.cpp,包括 ah(它有自己的 a.cpp)啊,包括头文件库“stbi_image.h”,如下所示:

https://github.com/nothings/stb

*.cpp 包含它自己的 *.h 并使用 #pragma once

但我仍然得到:

LNK1169 发现一个或多个多重定义的符号 LNK2005 stb-failure 原因已在 a.obj 文件 = main.obj 中定义...和其他一堆

这对我来说似乎是正确的,但正如我在这个问题中所理解的那样: Multiple definition and header-only libraries

也许我应该将 inline/static 添加到我需要的 stb_image.h 函数中?难道我做错了什么?

提前致谢

0 投票
1 回答
1718 浏览

c++ - 仅标头库中的 C++ 内联函数和模板函数

为了避免由于过度内联而导致代码加载...
这是实现类似于内联函数的模板函数的有效方法吗?

原始内联函数声明:

使用模板函数的替代函数声明:

0 投票
1 回答
111 浏览

c++ - 我什么时候应该在现代 C++ 中使用(非头文件)源文件?

编写 C++ 代码的典型方法是将其分隔在头文件和(非头)源文件中。

我看到了很多只有头文件的现代 C++ 库(例如一些 Boost 库)。通常,这些库会大量使用模板。

他们没有将文件分离为头文件和源文件,而是将文件分离为头文件声明和头文件实现。

所以我的问题是:

  • 它只是使用源文件的老式方式吗?

  • 什么时候使用源文件才有意义?

  • 创建仅标头库的优缺点是什么?

0 投票
0 回答
1196 浏览

c++ - 是否可以将 Boost 序列化用作仅标头库?

下面是一个使用强大的Boost.Serialization库的最小示例。

要编译库,我需要链接boost_serialization预编译的库。

该库被大量模板化,虽然内部复杂,但实际代码(函数体)非常简单。只有少数引用需要链接,即:

是否有机会在不链接为仅标头库的情况下使用该库?

例如一些未记录的技巧或黑客行为?

这将使其在一些超级计算机集群和环境中使用起来更加简单,而这些环境并不是那么简单地编译 Boost。


编辑:如果图书馆只提供标题选项,我会非常酷,就像 Boost.Asio 一样(https://stackoverflow.com/a/40729439/225186。)


EDIT2:Boost.Serialization 的作者和维护者拒绝了仅将其设为标题的想法。https://github.com/boostorg/serialization/issues/71

0 投票
1 回答
4346 浏览

c++ - 仅标头库中静态成员变量的正确设置器和获取器

我有一些小型的仅标头库(仅标头部分很重要)。在最初的版本中,我在其中定义的类中有一些静态成员。直到后来(当我在一个更大的项目中使用它们时)我才意识到静态成员会违反 ODR。我想让它们只保留标题,因此在单独的 .cpp 文件中定义静态成员是不可能的。一个众所周知的解决方案是为每个静态成员使用Meyers 单例函数局部静态变量(如建议的那样,例如,here)。

这一切都很好,但是由于我希望单例的行为类似于成员变量,因此我希望能够使用 setter 和 getter 获取和设置值。但是Meyers 单例函数局部静态变量的 getter 和 setter 是什么样的呢?我一直无法找到解决该特定问题的任何方法。

为了澄清,这些是要求:

  • 我想要一个仅标头库中的静态成员变量的行为(所以不能将定义放在 .cpp 文件中)
  • 我想要一个 getter,它只是一个getter(我不应该通过分配给 getter 返回的引用 来修改值)
  • 我还希望能够通过专用的setter修改值。

编辑1:

我想解释一下为什么你可能需要这个。

我提到的库中的静态变量定义了一些参数的默认值。但是,我不想硬编码这些默认值,而是让用户可以在程序开始时设置默认值,这样他们就不必在每次调用成员函数或构造一个成员函数时手动传递值新实例。

此外,虽然我同意在此处提供的示例中使用术语“Meyers singleton”具有误导性(我只是使用一个int值),但没有什么能阻止您将此范例与您只想要一个的自定义类一起使用的实例。在这种情况下,“Meyers singleton”一词将是合理的。


编辑2:

这与在 C++17 中引入变量有些无关inline static,但我将把它留给没有选择使用 C++17 的人。