仅限C++头文件的模板库
查看此项目(http://www.savarese.com/software/libssrckdtree/),我找到了定义" C ++ header-finly模板库".目前,我有基本的C ++知识,但想知道这到底意味着什么,以及为什么这个人在这个项目上使用它 解决方案 这意味着模板的所有定义(功能模板或类模板)仅在标题中.没有.cpp文件.只有.h文件(或其他一些扩展名,例如.hpp或根本没有扩展名,例如,string>等) ) c ++编译器要求在声明的同一文件中存在模板的定义.因此,仅标题库既不是静态库也不是动态库.它的 source-code 库,这意味着您可以在标题中看到实现.您已将标题文件包含在您的代码中,该文件与库中的标题一起编译. 注意C ++标准库的一部分,该库使用,string>,等的模板是仅标头库. 实际上不能将模板(类模板和功能模板)编译到静态或动态库中,以链接到程序.正如该术语本身所说,模板是
12 2023-10-15
编程技术问答社区
如何在一个仅有头的库中拥有静态数据成员?
在非策略库类中拥有静态成员的最佳方法是什么, 不在班级用户上定义会员的负担吗? 说我想提供此类: class i_want_a_static_member { static expensive_resource static_resource_; public: void foo() { static_resource_.bar(); } }; 那么,班级的用户一定不能忘记在某个地方定义静态成员 (如已经回答 许多 times ): // this must be done somewhere in a translation unit expensive_resource i_want_a_static_member::static_resource_; 我确实有一个答案,但它有一些缺点.有更好和/或更优雅的解决方案吗? 解决方案 C ++ 17及以上 使用inline static用于非动态初始
4 2023-09-29
编程技术问答社区
只包含C++头的模式
我想在.hpp中编写代码,而不会分离为.h和.cpp 我做到了.我仅将.cpp用于静态类场定义 我不想手动写#include ... 我在可能的情况下使用前向分层. 我的每个.hpp文件都有#pragma一次. 但是,当我的项目成长多达40-50个课程时,我看到了Include Graph的问题.定义有一些错误. 图像带有我的项目模型的图形(如MVC的一部分). 我用 包含图的外观如何?像一棵树? 如何不手动写入,例如在c#或java中? 解决方案 不幸的是,您可能使用错误的语言.当您将类定义与实现分开时,C ++中有些事情变得更加容易.即使有了正向声明,您可能仍然会遇到只能通过将实施方式移动到单独文件的循环依赖项. 如果您想编写惯用的Java,只需在Java中写下它.如果不幸地使用C ++语言,则必须在其约束中工作. 其他解决方案 让我们假设您每个类都有一个.hpp文件,那么,Incluph Graph类似于类依赖关系图. 为了重复
16 2023-05-16
编程技术问答社区
在CLion中,只有头文件:文件 "不属于任何项目目标,代码洞察功能可能无法正常工作"
我有一个仅使用CMAKE命令设置的仅标题库项目: add_library(my_library INTERFACE) 我还添加了 target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES}) 但是,当我打开源文件时,我会收到警告: 此文件不属于任何项目目标,代码洞察功能可能无法正常工作 我在代码完成等方面失去了很多功能. 设置此设置的正确方法是什么,因此Clion在仅标题库上提供了通常的功能? 解决方案 小背景 我遇到了同样的问题,尽管该项目不仅仅是标题,但是,即使CMake文件明确标记为include_directory,inc文件夹中的打开文件仍在抛出上述警告. *.HPP文件不属于$ {source} include_directories("${PROJECT_SOURCE_DIR}/inc/") add_subdirectory(src) add_e
1854 2023-03-15
编程技术问答社区
CMake: target_include_directories()在我尝试添加源代码目录本身或其子目录之一时,打印出一个错误。
我正在编写C ++库(仅标题),并使用CMAKE生成我的(Visual Studio)项目和解决方案文件.我还写了一个测试套件,这是同一CMAKE项目的一部分. 当我在代表我的仅标题库的目标上调用target_include_directories()时,就会发生我的问题,以便我的库的消费者可以找到其标题文件.我收到以下错误消息(即使没有中止). CMake Error in CMakeLists.txt: Target "Fonts" INTERFACE_INCLUDE_DIRECTORIES property contains path: "D:/Projects/GPC/fonts/include" which is prefixed in the source directory. (d:/projects/gpc/fonts是我的库项目的顶级目录.顺便说明,如果我将标题文件移至顶级目录,则问题仍然存在.) 我的cmakelists.tx
176 2023-03-15
编程技术问答社区
CLion不能解决来自外部库的头文件
前一段时间,我使用Xcode在C ++ 1X中启动了一个大标题库.库的当前布局是()类似于(ls -R sponf的部分输出) sponf/sponf: ancestors sponf.h sponf_utilities.h categories sponf_children.h utilities children sponf_macros.h sponf/sponf/ancestors: function.h meter.h set.h simulation.h sponf/sponf/categories: free_space.h prng.h random_distribution.h series.h sponf/sponf/children: distributio
136 2023-03-15
编程技术问答社区
双重包容和头文件库stbi_image
我有一个包括A.H在内的Main.CPP(具有自己的A.CPP) A.H包括仅标头库" stbi_image.h": #ifndef STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #endif ( https://github.com/nothings/stb ) ) *.cpp一旦使用#pragma ,包括自己的 *.h 但我仍然得到: lnk1169找到LNK2005 STB-FAILURE的一个或多个倍数定义的符号 A.Obj文件中已经定义的原因= main.obj ...和一堆 其他 对我来说似乎是正确的,但是正如我在这个问题中所理解的那样: 多重定义和header-horly listries 也许我应该将内联/静态添加到我需要的stb_image.h函数? 我做错了吗? 预先感谢 解决方案 也许我应该将内联/静态
16 2023-03-02
编程技术问答社区
我应该在什么时候考虑把图书馆变成纯头条?
显然,模板库只需要成为标题,但是对于非template,您什么时候应该使事物仅限为标题? 解决方案 如果您认为您的非模板库可能仅为标题,请考虑将其分为两个文件,然后提供包括.h和.cpp>的第三个文件(带有inclage ). 然后任何在许多不同的tus中使用您的库的人,并怀疑这可能会花费大量编译时间,可以轻松地进行更改以测试它. 一旦您知道用户可以选择使用库的方式,答案可能会"随时随地提供该选项".因此,几乎任何时候,包括多个tus在内的它都不会违反ODR.例如,如果您的非 - static免费功能是指static globals,那么您不运气,因为该功能在不同的TU中的不同定义将以同一名称指的是不同的对象,这是一个odr-violation. 其他解决方案 您可以关注BOOST.ASIO LEAD. 他们只提供了库的两个版本:仅标题和标题 +库. 他们在包含标题之前使用单个宏(或不定义)进行操作.我认为默认值(如果未定义)是使用仅标题版本.
22 2023-02-25
编程技术问答社区
关于只用头的C++库的使用的可量化指标(基准)。
我试图使用SO找到答案.有许多问题列出了在C ++中构建仅标题库的各种利弊,但是我找不到一个以可量化的术语来做的. 因此,在可量化的术语中,使用传统分离的C ++标头和实现文件仅与标头之间有什么不同? 为简单起见,我假设不使用模板(因为它们仅需要标题). 为了详细说明,我已经列出了我从文章中看到的内容,成为利弊.显然,有些不容易量化(例如易用性),因此对于可量化的比较毫无用处.我会用(可量化)标记我期望可量化的指标的那些. 专业人士仅针对标题 易于包含,因为您不需要在构建系统中指定链接器选项. 您始终使用与代码的其余部分相同的编译器(选项)编译所有库代码,因为库的函数已在您的代码中列入. 它可能更快. (可量化) 可以为编译器/链接器提供更好的优化机会(如果可能的话,说明/可量化) 如果您无论如何都使用模板. 仅标头的缺点 它会膨胀代码. (可量化)(这如何影响执行时间和内存足迹) 更长的编译时间. (可量化) 接口和实现的分离丧失.
24 2023-02-25
编程技术问答社区
我如何创建一个仅有头的库?
我想打包我作为仅本库库的库,以使客户更容易使用. (这很小,实际上没有理由将其放入单独的翻译单元中)但是,我不能简单地将代码放在标题中,因为这违反了C ++的一个定义规则. (假设库标头包含在客户端项目的多个翻译单元中) 一个人如何修改库以使其仅限标题? 解决方案 您可以使用inline关键字: // header.hpp (included into multiple translation units) void foo_bad() {} // multiple definitions, one in every translation unit :( inline void foo_good() {} // ok :) inline允许链接器简单地选择一个定义并丢弃其余的. (因此,如果这些定义实际上不匹配,您会得到不确定的行为...!) 顺便说一句,在类型中定义的成员函数被隐式标记为inline: struct myclass {
118 2023-02-24
编程技术问答社区
只用头的库的好处
只有标题库的好处是什么?为什么要以这种方式将其写入单独的文件? 解决方案 在某些情况下,唯一的选择是唯一的选择,例如在处理模板时. 拥有仅限标题库也意味着您不必担心可以使用库的不同平台.当您将实现分开时,通常是为了隐藏实现详细信息,并将库作为标头和库的组合分布(lib,dll,dll的s或.so文件).当然,必须针对您提供支持的所有不同操作系统/版本进行编译. 您也可以分发实现文件,但这对用户来说意味着额外的步骤 - 在使用库之前对您的库进行编译. 当然,这适用于逐案case 的基础.例如,仅标题库有时会增加代码大小和汇编时间. 其他解决方案 仅标题库的好处: 简化了构建过程.您无需构建库,也无需在构建的链接步骤中指定编译的库.如果您确实有一个编译的库,则可能需要构建它的多个版本:一个版本启用了调试,另一个启用了优化,可能是另一个符号.也许对于多平台系统. 仅标题库的缺点: 更大的对象文件.来自库中某些源文件中使用的每个内联方法还将在该
32 2023-02-23
编程技术问答社区