无论如何都可以初始化一个大型 const 数组而不键入其中的每个元素,例如:
试图创建一个数组:
const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};
用循环很容易做到。
如果它真的必须是 const 并且您有 1000 个不同的值,请编写一些儿童应用程序/脚本将其作为头文件吐出并防止您输入!如果需要,这为您提供了一种稍后修改整个数组初始化的简单方法。
您可以为此使用 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::preprocessor 中的大多数迭代方案都被限制为最大值。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");
}
我以为你可以用宏来做到这一点,我很确定它可以做到,但我现在不能让它工作。如果我能正常工作,我会回来的。