Код, объявляющий анонимные структуры в цикле 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 не разрешено, я должен сделать макрос менее интуитивным в использовании. Я не мог передать исходное объявление -остальной части дерева, поскольку он использует массив переменной длины.