Ich habe festgestellt, dass wir an mehreren Stellen in unserer Codebasis dynamisch expandierende Arrays verwenden, d. H. Ein Basis-Array gekoppelt mit einem Element-Zähler und einem "Max-Elemente" -Wert.Ein gutes C-Äquivalent von STL-Vektor?
Was ich tun möchte, ist diese für die üblichen objektorientierten Gründe durch eine gemeinsame Datenstruktur und Dienstprogrammfunktionen zu ersetzen. Die Array-Elemente können entweder grundlegende Datentypen oder Strukturen sein, ich brauche schnellen wahlfreien Zugriff auf die Elemente und vorzugsweise eine typsichere Implementierung.
Also, im Grunde, verwenden, was ich möchte, ist ein STL-Vektor, aber der Code-Basis C89 beschränkt ist, so muss ich etwas anderes :-) kommen
ich es einige Gedanken gab und Schlag nur auf diesen ursprünglichen Entwurf, um zu zeigen, was auf das ich bin mit dem Ziel:
/* Type-safe dynamic list in C89 */
#define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t
#define list(type) type##_list_t
#define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size }
#define list_free(list) free(list.base_array)
#define list_set(list, place, element) if (list.elements < list.max_size) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if (list.elements < list.max_size) { list.base_array[list.elements++] = element; } else { /* Expand array then add */ }
#define list_get(list, n) list.base_array[n]
/* Sample usage: */
list_declare(int);
int main(void)
{
list(int) integers = list_new(int, 10);
printf("list[0] = %d\n", list_get(integers, 0));
list_add(integers, 4);
printf("list[0] = %d\n", list_get(integers, 0));
list_set(integers, 0, 3);
printf("list[0] = %d\n", list_get(integers, 0));
list_free(integers);
return EXIT_SUCCESS;
}
... aber es jemand sein muss, sonst, die zuvor getan hat. Ich kenne die FreeBSD sys/queue.h-Implementierung eines ähnlichen Konzepts für einige verschiedene Warteschlangen, aber ich kann nichts Ähnliches für Arrays finden.
Ist hier jemand weiser?
Zumindest eine der Makros loswerden und ersetzen sie durch Funktionen oder sie beheben, so dass sie wie funktionieren Funktionen. Letzteres beinhaltet das Umschließen eines Makros, das mehr als ein Ausdruck/eine Anweisung ist, mit "do {...} while (0)". –
Warum sollte ich die Makros loswerden wollen? Würde man sie durch Funktionen ersetzen, würde dies die Typunabhängigkeit zunichte machen, es wäre keine generische Lösung mehr. Auch, warum sollte ich mit do ... während? Das würde es unmöglich machen, Werte aus den funktionsähnlichen Makros zurückzugeben. – Christoffer
@christoffer: Lesen Sie Rs Kommentar erneut. Beachten Sie die Verwendung von "oder" - diese Funktionsmakros sind schrecklich, Sie sollten sie verbessern, indem Sie sie "reparieren", wie R sagt. Dies macht die Verwendung eines Funktionsmakros weniger überraschend. Ich persönlich würde es vorziehen, wenn die Funktionsmakros großgeschrieben würden. – Arafangion