我有一个c样式的数组,其大小由#define
定义,并且可以根据编译选项进行更改,例如
#if LINUX
# define SIZE 4
#else
# define SIZE 5
#endif
static int myArr[SIZE] = { /* ??? */ };
如何将整个数组初始化为非零值,例如所有42
?
答案 0 :(得分:8)
我不知道C样式数组的解决方案,尽管使用constexpr
和C ++ 17可以使用std::array
做到这一点。
constexpr std::array<int, SIZE> createFilledArray (int value){
std::array<int, SIZE> a{0};
for (auto i = 0; i < SIZE; ++i)
a[i] = value;
return a;
}
static constexpr auto myArr = createFilledArray(42);
这的缺点是您不能更改数组。
如果从变量中删除constexpr
,则编译器应该能够对此进行优化。
从C ++ 20开始,您可以强制进行初始化:
static constinit auto myArr = createFilledArray(42);
不确定该提案是否已合并到其中:请参见constinit proposal
答案 1 :(得分:3)
如果您坚持使用内置数组,则可以在函数中使用静态变量:
template <std::size_t N, std::size_t... Is>
auto arr_helper2(std::index_sequence<Is...>) -> int (&)[N]
{
static int arr[N] = {((void)Is, 42)...};
return arr;
}
template <std::size_t N>
auto arr_helper() -> int (&)[N]
{
return arr_helper2<N>(std::make_index_sequence<N>{});
}
static int (&arr)[SIZE] = arr_helper<SIZE>();
例如:
int main()
{
for (std::size_t i = 0; i < SIZE; ++i)
std::cout << arr[i] << " ";
}