生成的静态数组的包装宏

时间:2015-10-26 10:57:36

标签: c++ c-preprocessor variadic-macros

我正在努力生成一些大型静态元数据结构,并希望优化一些生成的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多个元素。这有可能解决一些创造性的预处理器黑魔法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用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 };

答案 1 :(得分:0)

我在这里为自己的问题添加答案。

这里描述的MAP宏几乎完成了我对第二种方法(https://github.com/swansontec/map-macro)的需要。

使用它可以很容易地实现这个:

METADATA_ARRAY(MetaDataObject,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);

第一个宏似乎还有点难以完成。