我写了很多像这样的代码
int x = 0;
//in some loop
x++;
if (x > 10) {
x = 0;
//call some function
}
我怎样才能将它提取到函数或宏中,我可以将递减(或递增),超过(或低于)的值,复位值(在本例中为0)和函数调用组合在一起?
编辑:
我喜欢做(伪代码)
之类的事情
cycle_counter(x, ++, <10, 0, myfunc);
答案 0 :(得分:1)
#define SATURATE_ADD(x, max, inc, reset) ((x) = (x) > (max) ? (reset) : (x) + (inc))
并在您的示例中:
int x = 0;
SATURATE_ADD(x, 10, 1, 0);
如果你想调用某个函数,只需添加一个你将在宏中调用的函数参数。
答案 1 :(得分:0)
我尝试创建一个函数来解决类似于伪代码
中的函数的问题void cycle_counter(int *px, char operatorr, int max, int init, void (*p)())
{
*px=init;
//in some loop
operatorr?(*px)++:(*px)--; //if the operator is 0 we usee -- otherwise ++
((*px)>max)?((*px)=0,p()):0; // This line replaces the if statement in your
// code and the callback
}
所以我们在这里使用了指向px
的名为x
的指针,以便它可以保留更改
运算符operatorr
是一个布尔值,对--
和++
取值 0 ,否则
max
是一个整数,将提供用于比较。在您的示例中,它将 10
init
用于初始化指针px
最后p
引用指向函数的指针
现在,如果您想在main函数中调用此函数,您将继续这样做
cycle_counter(px, 1, 10, 0, myfunc);
带有px
的是
int x;
int *px=&x;
有一些例外没有得到处理,但我已经尝试制作难以处理 指向函数的指针 的部分。另一部分(未完成&gt;和&gt; =)很容易让三元运算符处理所有情况变得更加复杂但你可能会得到一个可爱的行,可以被视为混淆 line;)