2016-08-04 17 views
-4

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?

+4

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 –

+0

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

+0

Das Wort, das Sie suchen, ist "portable" –

Antwort

1

Ja, es ist gültig und wird immer funktionieren.

nehmen Sie Ihre for-Schleife,

for(iter_type _iter = (iter_init(container_ptr, &_iter), _iter); \ 
     (elem_ptr = iter_next(&_iterator));) 

und speziell die Initialisierung Klauseliter_type _iter = (iter_init(container_ptr, &_iter), _iter), können Sie die Komma-Operator hier beteiligt sehen, dass.

Der Komma-Operator wird immer von links nach rechts ausgewertet, und es gibt eine Sequenz zwischen jedem seiner Operanden.

+0

Eigentlich ist der Komma-Operator ein binärer Operator, also hat er nur zwei Operanden. Und ich denke du meinst Sequenz Sequenz? – Olaf