出于兼容性原因,我想定义一个像这样工作的迭代器宏:
elem_type *ptr;
ITERATE(&container, ptr) {
// This will loop through every element of the container
// ptr will point to the current element.
}
我有一个迭代器类型,必须使用函数调用进行初始化,其工作方式如下:
iter_type iter;
iter_init(&container, &iter);
while((ptr = iter_next(&iter))) {
// ...
}
所以,这是我将这个序列压缩到宏中的解决方案:
#define ITERATE(container_ptr,elem_ptr) \
for(iter_type _iter = ( \
iter_init(container_ptr, &_iter), _iter); \
(elem_ptr = iter_next(&_iterator));)
因此,正如您所看到的,逗号运算符有一个小技巧,以便在for
的第一个冒号中同时包含变量声明和函数调用初始化。这段代码是否有效C99,并且一直有效?
答案 0 :(得分:1)
是的,它有效且永远有效。
刚刚接受你的循环,
for(iter_type _iter = (iter_init(container_ptr, &_iter), _iter); \
(elem_ptr = iter_next(&_iterator));)
,特别是初始化子句 iter_type _iter = (iter_init(container_ptr, &_iter), _iter)
,您可以看到这里涉及逗号运算符。
逗号运算符始终从左到右进行计算,每个操作数之间都有一个序列。