Я пошел с методом инициализации массива:
#include <stdarg.h>
void int_array_init(int *a, const int ct, ...) {
va_list args;
va_start(args, ct);
for(int i = 0; i < ct; ++i) {
a[i] = va_arg(args, int);
}
va_end(args);
}
называется вроде,
const int node_ct = 8;
int expected[node_ct];
int_array_init(expected, node_ct, 1, 3, 4, 2, 5, 6, 7, 8);
Инициализация массива C99, например:
const int node_ct = 8;
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
И в configure.ac
:
AC_PROG_CC_C99
компилятор на моем ящике разработчика был совершенно счастлив. Компилятор на сервере пожаловался:
error: variable-sized object may not be initialized
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
а также
warning: excess elements in array initializer
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
для каждого элемента
Он вообще не жалуется, например:
int expected[] = { 1, 2, 3, 4, 5 };
Мне нравится проверка размера и то, что поддержка varargs действует более надежно, чем поддержка инициализатора массива.
Найдите PR с образцом кода на https://github.com/wbreeze/davenport/pull/15/files
Что касается https://stackoverflow.com/a/3535455/608359 от @paxdiablo, мне понравилось; но чувствовал себя неуверенно из-за того, что количество раз, когда указатель инициализации продвигается, синхронизировано с количеством элементов, выделенных для массива. В худшем случае указатель инициализации выходит за пределы выделенной длины. Таким образом, разница в PR содержит,
int expected[node_ct];
- int *p = expected;
- *p++ = 1; *p++ = 2; *p++ = 3; *p++ = 4;
+ int_array_init(expected, node_ct, 1, 2, 3, 4);
Метод int_array_init
безопасно назначит мусор, если количество аргументов меньше, чем у node_ct. Мусорное присваивание должно быть легче поймать и отладить.
person
Douglas Lovell
schedule
19.07.2019
memcpy
). Я часто ловлю себя на том, что хочу, чтобы у меня была эта функция. - person bta   schedule 21.08.2010