我现在正致力于生成一些大型静态元数据结构,并希望优化一些生成的 C++ 文件的大小。
static constexpr MetaData* metaDataArray[] = {
&MetaDataObject0,
&MetaDataObject1,
&MetaDataObject2,
&MetaDataObject3,
&MetaDataObject4,
&MetaDataObject5,
&MetaDataObject6,
&MetaDataObject7,
&MetaDataObject8,
&MetaDataObject9,
&MetaDataObject10,
&MetaDataObject11,
&MetaDataObject12,
&MetaDataObject13,
&MetaDataObject14,
&MetaDataObject15,
&MetaDataObject16,
&MetaDataObject17,
&MetaDataObject18,
&MetaDataObject19,
&MetaDataObject20
}
这是我想包装到宏中的数组示例。最好是这样的:
METADATA_ARRAY(MetaDataObject,20);
我意识到这可能非常棘手。我还没有真正找到这个问题的解决方案,也许甚至不可能创建一个在保持索引计数器变量的同时扩展的递归宏?
也许按照这些思路来瞄准宏更可行:
METADATA_ARRAY(MetaDataObject,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
我发现了一些像这样的可变参数宏的引用(沿着这些 行:https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s ).
虽然这种方法似乎仅限于 64 个参数。我们生成的代码中的一些数组有 3000 多个元素。这有可能通过一些创造性的预处理器黑魔法来解决吗?
最佳答案
您可以使用 Boost 预处理器实现此目的:
#include <boost/preprocessor.hpp>
#define DECLARE_ENTRY(z, n, base_name) BOOST_PP_COMMA_IF(n) &base_name ## n
#define METADATA_ARRAY(type, var_name, base_name, count) static constexpr type* var_name[] = { \
BOOST_PP_REPEAT(count, DECLARE_ENTRY, base_name) \
}
演示:
METADATA_ARRAY(MetaData, metaDataArray, MetaDataObject, 5);
这导致:
static constexpr MetaData* metaDataArray[] = { &MetaDataObject0 , &MetaDataObject1 , &MetaDataObject2 , &MetaDataObject3 , &MetaDataObject4 };
关于c++ - 生成的静态数组的包装器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33344010/