Объявление анонимной структуры в цикле for, clang не компилируется

Код, объявляющий анонимные структуры в цикле for, отлично работал в gcc с -std=c99/gnu99

for (struct {int foo; int bar;} i = {0}; i.foo < 10; i.foo++);

Однако, когда я вместо этого переключаюсь на clang, я получаю сообщение об ошибке:

error: declaration of non-local variable in 'for' loop

Почему это ошибка? Почему это разрешает некоторые типы (, например. "int" ), но не другие (, например. структура {int foo;} )? Это кажется непоследовательным. Clang не может правильно реализовать c99 или этот код недействителен для c99, а gcc просто поддерживает его?

Кто-нибудь знает способ объявить несколько типов переменных в цикле for, который поддерживается clang? (Это полезно для макросов.)

РЕДАКТИРОВАТЬ:

Поскольку люди спрашивали, почему это полезно, я вставлю пример кода:

#define TREE_EACH(head, node, field, iterator) for ( \
    /* initialize */ \
    struct { \
        node* cur; \
        node* stack[((head)->th_root == 0? 0: (head)->th_root->field.avl_height) + 1]; \
        uint32_t stack_size; \
    } iterator = {.cur = (head)->th_root,.stack_size = 0}; \
    /* while */ \
    iterator.cur != 0; \
    /* iterate */ \
    (iterator.stack_size += (iterator.cur->field.avl_right != 0) \
        ? (iterator.stack[iterator.stack_size] = avl_right, 1) \
        : 0), \
    (iterator.cur = (iterator.cur->field.avl_left == 0) \
        ? iterator.cur->field.avl_left \
        : (iterator.stack_size > 0? (iterator.stack_size--, iterator.stack[iterator.stack_size]): 0)) \
)

Это действительно удобный макрос, который я написал, который перебирает дерево AVL в глубину -первого порядка в стеке. Поскольку объявление анонимных структур в цикле for не разрешено, я должен сделать макрос менее интуитивным в использовании. Я не мог передать исходное объявление -остальной части дерева, поскольку он использует массив переменной длины.

8
задан Hannes Landeholm 10 August 2012 в 14:37
поделиться