【发布时间】: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 发布时已被撤回。