Aus Kompatibilitätsgründen möchte ich einen Iterator Makro definieren, die wie folgt funktioniert:Ist dieser Code gültig?
elem_type *ptr;
ITERATE(&container, ptr) {
// This will loop through every element of the container
// ptr will point to the current element.
}
ich eine Iteratortyp haben, die mit einem Funktionsaufruf initialisiert werden muss, und funktioniert wie folgt:
iter_type iter;
iter_init(&container, &iter);
while((ptr = iter_next(&iter))) {
// ...
}
Also, das ist die Lösung, die ich diese Sequenz in das Makro zu drücken kam:
#define ITERATE(container_ptr,elem_ptr) \
for(iter_type _iter = (\
iter_init(container_ptr, &_iter), _iter); \
(elem_ptr = iter_next(&_iterator));)
so, wie Sie sehen können, gibt es einen kleinen Trick w Mit dem Komma-Operator, um sowohl eine Variablendeklaration als auch die Initialisierung des Funktionsaufrufs im ersten Doppelpunkt der for
anzupassen. Ist dieser Code C99 gültig und wird immer funktionieren?
gültig? definiere gültig. ist es vielleicht ein erster Schritt? Außerdem sind Sie nicht der Erste, der dieses Makro erfindet, es ist eine gewöhnliche Sache - Überprüfen Sie den Linux-Kernel –
Meine Definition von gültig ist in: "und wird immer funktionieren". Wenn das nicht klar genug ist, meinte ich mit "immer" jede C99-Reklamationsimplementierung. Und es ist irrelevant, dass ich nicht der Erste bin, der dieses Makro erfindet, wenn ich nicht wüsste, wo ich danach suchen soll. Schließlich, wie kann es in Kernel-Code sein, wenn der C99-Schalter in den Build-Optionen nicht aktiviert ist? – lvella
Das Wort, das Sie suchen, ist "portable" –