【发布时间】: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