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

Thr*_*986 2 c c99 sequence-points

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

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

size_t ptr = 0;  
// do some work...
p = ++p % 10;
Run Code Online (Sandbox Code Playgroud)

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

p++;
p %= 10;
Run Code Online (Sandbox Code Playgroud)

然而,我正在寻找更简洁的东西(即一个单行)来"封装​​"这个操作.建议?除了p ++之外; p%= 10; :-)

Oli*_*rth 7

p = (p + 1) % N;
Run Code Online (Sandbox Code Playgroud)

或者避免使用模数:

p = ((N-1) == p) ? 0 : (p+1);
Run Code Online (Sandbox Code Playgroud)