初始化大型常量数组
Initialization of a large const array?
是否可以初始化一个大型常量数组,而不必键入其中的每一个元素,例如:
尝试创建数组:
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");
}
我以为你可以用宏来做这件事,我很确定它可以做到,但我现在不能让它工作。如果我让它工作起来,我会回来的。
- 是默认情况下分配给char数组常量的值
- 如何创建长度由常量参数指定的数组
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 将字符串数组传递给接受常量字符**的函数
- 检查输入 std::array 指针数据是否等于某个常量数组
- 为什么不能用常量表达式声明数组?
- 如何在可执行文件中存储常量数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 初始化常量字符* 数组
- C++将常量字符* 指针数组传递给对象
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 如何为包含另一个类实例的数组制作常量 getter?
- LLVM 无法将数组类型强制转换为常量数组
- 如何删除#define使用在c++数组常量
- 静态数组常量是否会影响共享库布局