【问题标题】:conditionally integrate functionality from one header into another if it's included (is this even necessary?)如果包含,则有条件地将功能从一个标头集成到另一个标头中(这甚至有必要吗?)
【发布时间】:2020-12-17 12:45:31
【问题描述】:

也许我想错了,因为我在 C# 上花了这么多年远离 C++,我有点生疏了。我忘记了选择性链接有多好。

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

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

目前,由于缺乏更好的方法,我有一个 #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() 如果从未使用过就永远不会被链接?

其次,如果有必要,有什么更好的方法呢?现在,包含依赖于订单并且代码很臭。我想改变它。基本上它现在就在那里,直到我找到更好的东西,因为它比以后如果我需要它更容易删除。

提前致谢。

更多代码如下:

通过 JsonTree.h 从 JsonTree.hpp:

#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 是我在两个功能领域之间的集成点

【问题讨论】:

    标签: c++ c++11 linker c-preprocessor


    【解决方案1】:

    首先,这有必要吗

    绝对不是。

    或者我可以无条件地包含所有功能并期望 parseSubtree() 永远不会被链接到,如果它从未使用过?

    你完全可以。从第一天开始,所有现存的图书馆都是这样运作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 2020-08-05
      • 2011-07-17
      相关资源
      最近更新 更多