c++ - 生成的静态数组的包装器宏

标签 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 多个元素。这有可能通过一些创造性的预处理器黑魔法来解决吗?

最佳答案

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

相关文章:

c++ - 使用 SSE2 和 AVX2 编译库

c - 是否可以 typedef 预处理器指令?

C++ 添加仅在调试时运行的调试代码

c - C 中的 token 粘贴

c++ - Visual Studio __VA_ARGS__ 问题

c++ - 一个类中的多个可能的模板

c++ - 只将一个整数发送到一个接受两个整数的函数

c - 如何在宏中将可变参数与 printf 一起使用?

c++ - 将 12 位颜色值转换为 8 位颜色值 C++

c - #define 变量的范围是什么?