【问题标题】:Is this code valid? [closed]此代码有效吗? [关闭]
【发布时间】:2016-08-04 18:13:04
【问题描述】:

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

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,并且将始终有效?

【问题讨论】:

  • 有效吗?定义有效。它是否编译可能是第一步。另外,你不是第一个发明这个宏的人,它很常见 - 检查 linux 内核
  • 我对有效的定义如下:“并且永远有效”。如果这还不够清楚,我所说的“总是”是指每个 C99 投诉实施。如果我不知道在哪里寻找它,我不是第一个发明这个宏的人是无关紧要的。最后,如果构建选项中没有启用 C99 开关,它怎么会在内核代码中?
  • 你要找的词是“便携”
  • @DanielMargosian 如果我明确命名为 ISO 标准,则不会。在那种情况下,这个词真的是有效的。
  • C99 不是 C 标准!它已经过时,在 C11 发布时已被撤回。

标签: c c99


【解决方案1】:

是的,它是有效的,并且会一直有效。

只需使用你的 for 循环,

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

特别是初始化子句iter_type _iter = (iter_init(container_ptr, &_iter), _iter),可以看到这里涉及到了逗号。

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

【讨论】:

  • 其实逗号运算符是一个二元运算符,所以它只有两个操作数。我认为你的意思是序列
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多