我已经在几个地方搜索了这个问题的解决方案,但结果很短。从本质上讲,我要做的是从常量 2d 数组的一行中分配一个 const 1D 数组,并专门在头文件中执行此操作。
说我有
const int Arr1[2][3] = {{1,2,3},{4,5,6}};
我想从这个数组初始化一个数组(在头文件中)。我知道通常我可以做到:
const int *Arr2 = Arr1[1];
或
const int *Arr2 = Arr1[0];
但是在头文件中这样做会产生多个定义错误。所以我的问题是是否有一种很好的方法来做到这一点。
多重定义错误与您的作业无关。
只需在标题中说
extern const int *Arr2;
并在单独的翻译单元中初始化它:
const int Arr1[2][3] = {{1,2,3},{4,5,6}};
const int *Arr2 = Arr1[1];
也许有选择地从预处理器指令中:
const int Arr1[2][3] = {{1,2,3},{4,5,6}};
#ifdef ZERO_PATH
const int *Arr2 = Arr1[0];
// ^ ZERO_PATH
#else
const int *Arr2 = Arr1[1];
#endif
您的代码:
const int *Arr2 = Arr1[1];
初始化指针,而不是数组。 数组和指针是不同的。从您的帖子中不清楚您是否满足于使用指针,但如果是这样,那么您要么需要按照 πάντα ῥεῖ 的答案进行设置;或者给出Arr2
内部链接:
const int *const Arr2 = Arr1[1]; // if you do not plan to change Arr2
static const int *Arr2 = Arr1[1]; // if you do
要实际使用数组,您可以编写:
const int Arr2[3] = { Arr1[1][0], Arr1[1][1], Arr1[1][2] };
无法将整个 C 样式数组用作相同类型另一个数组的初始值设定项。但是如果你使用C++式数组,你可以这样做:
const array<array<int, 3>, 2> Arr1 = {{ {1,2,3},{4,5,6} }};
const array<int, 3> Arr2 = Arr1[0];