生成的静态数组的包装宏 我正在研究生成一些大型静态元数据结构,并希望优化一些生成的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 }

生成的静态数组的包装宏 我正在研究生成一些大型静态元数据结构,并希望优化一些生成的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 },c++,c-preprocessor,variadic-macros,C++,C Preprocessor,Variadic Macros,这是一个我想包装成宏的数组示例。最好是这样: 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); 我发现了一些类似于这样的变量宏的引用(沿着

这是一个我想包装成宏的数组示例。最好是这样:

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);
我发现了一些类似于这样的变量宏的引用(沿着这些 行:)


不过,这种方法似乎仅限于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) \
        }
这导致:

static constexpr MetaData* metaDataArray[] = { &MetaDataObject0 , &MetaDataObject1 , &MetaDataObject2 , &MetaDataObject3 , &MetaDataObject4 };

您可以使用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) \
        }
这导致:

static constexpr MetaData* metaDataArray[] = { &MetaDataObject0 , &MetaDataObject1 , &MetaDataObject2 , &MetaDataObject3 , &MetaDataObject4 };

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

这里描述的MAP宏与第二种方法()所需的功能非常相似

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

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

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

我在这里为自己的问题添加了一个答案

这里描述的MAP宏与第二种方法()所需的功能非常相似

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

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

第一个宏似乎更难实现。

它必须是静态的吗?用全局构造函数填充一个单例数组是行不通的?有什么原因不能用联合来代替吗?包含数组或单个名称的联合。您能详细说明我在这种情况下如何使用联合吗?这对我来说并不明显。你愿意回答你正在使用哪种编译器吗?gnu g++4.63目前,更改到新版本也不是一个简单的过程(具有共享开发环境设置的大型组织)。它必须是静态的吗?用全局构造函数填充一个单例数组是行不通的?有什么原因不能用联合来代替吗?包含数组或单个名称的联合。您能详细说明我在这种情况下如何使用联合吗?这对我来说并不明显。你愿意回答你正在使用哪种编译器吗?gnu g++4.63目前,更改到新版本也不是一个简单的过程(具有共享开发环境设置的大型组织)。这非常优雅!不幸的是,它不是一个通用的解决方案。BOOST_PP_REPEAT的BOOST_PP_REPEAT限制为256。这非常优雅!不幸的是,它不是一个通用的解决方案。BOOST_PP_REPEAT的BOOST_PP_REPEAT限制为256。