初始化大型常量数组

Initialization of a large const array?

本文关键字:数组 常量 大型 初始化      更新时间:2023-10-16

是否可以初始化一个大型常量数组,而不必键入其中的每一个元素,例如:

尝试创建数组:

const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};

使用循环很容易。

如果它真的必须是const,并且您有1000个不同的值,请编写一些kiddy应用程序/脚本,将其作为头文件输出,并防止您键入!这为您提供了一种简单的方法来修改整个数组初始化,如果需要的话。

您可以使用boost的预处理器库来完成以下操作:

您的主文件:

#include <boost/preprocessor.hpp>

const double A[1000] = {
#define BOOST_PP_ITERATION_LIMITS (0, 9)
#define BOOST_PP_FILENAME_1 "toplevel.hpp"
#include BOOST_PP_ITERATE()
};

文件"toplevel.hpp":

#define ENUMERATE(z, i, data) 1.0 / (BOOST_PP_ITERATION() * 100 + i)
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(100, ENUMERATE, %%)
#undef ENUMERATE

它的工作原理是连续十次包含"toplevel.hpp",BOOST_PP_ITERATION()扩展到0,1。。9(0和9来自BOOST_PP_ITERATION_LIMITS(。

如果参数为非零,BOOST_PP_COMMA_IF()将生成逗号。

BOOST_PP_ENUM()将宏(在本例中为ENUMERATE(扩展100次,i得到值0到99(基于参数100(。

编辑

增加了说明,并删除了多余的BOOST_PP_OR()

编辑2

必须使用这种两阶段迭代(其中的文件和宏(,因为boost::预处理器中的大多数迭代方案最多只能进行256次迭代(存储在各种BOOST_PP_LIMIT_*宏中(。

也可以使用嵌套的BOOST _PP_ENUM((来完成,而不需要文件迭代。

您可以创建一个指向const char的指针数组,这样您就可以在运行时使用带有循环的new初始化它们。

否则,我不相信有什么办法。您可以直接在头文件中手动初始化它,或者去掉它的const状态。如果它在编译时没有初始化,编译器会抱怨没有初始化const变量。

如果必须这样做,我可能会写一个小程序来做到这一点:

for(i = 1; i <= 1000; i++)
{ 
    printf("1/%d.0, ", i);
    if(i % 10 == 0) printf("n");
}

我以为你可以用宏来做这件事,我很确定它可以做到,但我现在不能让它工作。如果我让它工作起来,我会回来的。