关于循环缓冲区中简洁索引处理的建议

时间:2010-10-07 13:55:10

标签: c c99 sequence-points

我已经实现了一个循环缓冲区,我想要一个简洁的方法来更新缓冲区指针,同时正确处理环绕。

假设一个大小为10的数组,我的第一个响应是:

size_t ptr = 0;  
// do some work...
p = ++p % 10;

静态分析,以及 gcc -Wall -Wextra ,由于序列点违规而正确地拍了我的手腕以查找未指定的行为。明显的解决方法是:

p++;
p %= 10;

然而,我正在寻找更简洁的东西(即单行)以“封装”此操作。建议?除了 p ++; p%= 10; : - )

3 个答案:

答案 0 :(得分:7)

p = (p + 1) % N;

或避免使用模数:

p = ((N-1) == p) ? 0 : (p+1);

答案 1 :(得分:0)

p++; p%=10;不同,我认为在p++, p%=10;中使用逗号运算符更适合作为“单行”。您可以在宏或循环体中使用它,或者在没有大括号的if / else语句中使用它,并计算结果值p

答案 2 :(得分:-2)

您是否考虑过++p %= 10;