Ich habe mich für eine Array-Initialisierungsmethode entschieden:
#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);
}
wie genannt,
const int node_ct = 8;
int expected[node_ct];
int_array_init(expected, node_ct, 1, 3, 4, 2, 5, 6, 7, 8);
Die C99-Array-Initialisierung, wie diese:
const int node_ct = 8;
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
Und in der configure.ac
:
AC_PROG_CC_C99
hatte den Compiler auf meiner Dev-Box vollkommen zufrieden. Der Compiler auf dem Server beschwerte sich mit:
error: variable-sized object may not be initialized
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
et
warning: excess elements in array initializer
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };
für jedes Element
Sie beschwert sich zum Beispiel überhaupt nicht über:
int expected[] = { 1, 2, 3, 4, 5 };
Ich mag die Überprüfung der Größe, und dass die varargs Unterstützung robuster als die Unterstützung für den Array-Initialisierer handelt.
PR mit Beispielcode finden Sie unter https://github.com/wbreeze/davenport/pull/15/files
Betreffend https://stackoverflow.com/a/3535455/608359 von @paxdiablo, ich mochte es; aber, fühlte sich unsicher über die Anzahl der Male, die der Initialisierungszeiger Fortschritte synchronisiert mit der Anzahl der Elemente zugewiesen, um das Array. Im schlimmsten Fall bewegt sich der Initialisierungszeiger über die zugewiesene Länge hinaus. Daher enthält der Diff im 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);
Le site int_array_init
Methode wird sicher Junk zuweisen, wenn die Anzahl der Argumente kleiner ist als der node_ct. Die Junk-Zuweisung sollte einfacher sein zu erkennen und zu debuggen.