如果有条件地将功能从一个标头集成到另一个标头中(这甚至有必要吗?



也许我想错了,因为我在C++之外的C#上花了这么多年时间,我有点生疏了。我忘了选择性链接有多好。

这真的是一个多部分的问题,我将从描述大局开始。

我正在为物联网设备等低内存环境构建JSON解析器和查询引擎。他们没有太多的代码空间,所以我希望最终开发人员只能包含他们打算使用的库的一部分。pull解析器是库的核心,所以这是给定的,但您可能不需要内存中的树。

目前,由于缺乏更好的方法,我在一个标头中定义了#define HTCW_JSONTREE。它由第二个标头拾取,第二个标题中包含一个函数,该函数取决于第一个标头中的代码。

#include "JsonTree.h" // optional
#include "JsonReader.h" // if JsonTree.h above is included
// extra functionality will be available from JsonReader

基本上,如果同时包含这两个头,那么返回内存中树的parseSubtree((函数将可用,但如果不包含JsonTree.h,则不可用。

首先,这是必要的吗?还是我可以无条件地包含所有功能,并期望parseSubtree((在从未使用过的情况下永远不会被链接进来?

第二,如果有必要的话,有什么更好的方法呢?现在,includes依赖于订单,代码散发着臭味。我想改变它。基本上,它现在就在那里,直到我找到更好的东西,因为如果我需要它,它比以后添加更容易删除。

提前谢谢。

以下是代码的更多内容:

从JsonTree.hpp经JsonTree.h:

#ifndef HTCW_JSONTREE_HPP
#define HTCW_JSONTREE_HPP
#define HTCW_JSONTREE
#include <cinttypes>
...

通过JsonReader.h:从JsonReader.hpp

#ifdef HTCW_JSONTREE
JsonElement* parseSubtree(mem::MemoryPool& pool,JsonParseFilter* pfilter = nullptr,mem::MemoryPool* pstringPool=nullptr,bool poolValues=false) {
...
#endif

JsonElement也来自JsonTree.h。parseSubtree是我在两个功能领域之间的集成点

首先,这是必要的吗

绝对不是。

或者我可以无条件地包含所有功能,并期望parseSubtree((在从未使用过的情况下永远不会被链接进来吗?

你完全可以。所有现存的图书馆从第一天起就是这样运作的。

最新更新