这段代码有效吗?

时间:2016-08-04 18:13:04

标签: c c99

出于兼容性原因,我想定义一个像这样工作的迭代器宏:

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,并且一直有效?

1 个答案:

答案 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),您可以看到这里涉及逗号运算符。

逗号运算符始终从左到右进行计算,每个操作数之间都有一个序列。