我想构造一个宏,每次循环结束迭代时,都会调用一个预定义的函数(在此由“这里调用fcn”模拟)。到目前为止,这是我真正可行的。
有没有更短的方法,最终有了更多的宏魔术来写这种行为?
#define MYWHILE(condition) \
while( \
[]()->bool { \
static bool called = false; \
if(called) std::cout<<"call fcn here"<<std::endl; \
called=true; return true;}() \
&& condition)
此宏应该在代码中的多个位置使用,以确保没有人在编写繁忙的等待循环时忘记忘记调用该函数。
一个典型的例子是:
while(true){
bool b = foo();
if(b){
break;
}
ros::spinOnce();
}
通常忘记了呼叫ros::spinOnce()
的地方,因此我只需将示例代码替换为:
MYWHILE(true){
bool b = foo();
if(b){
break;
}
}
纯C语言-代码也可以。
答案 0 :(得分:0)
我想构造一个宏,其中有一个预定义的函数(这里 每当循环结束时,都会调用“由这里调用fcn”模拟) 迭代,但不是第一次。
由于您提供的代码和您的问题存在冲突,因此尚不清楚您想要哪种行为。为实现上述目的,我建议完全不使用宏,而只需将代码编写为:
do {
if(!condition)
break;
// More code here
} while(fcn());
答案 1 :(得分:0)
您可以将所需的内容打包到while
循环中,而不是看起来很复杂的for
循环:
for (; condition; fcn())
该函数将在每次迭代结束时重新评估条件之前被调用。
答案 2 :(得分:0)
刚才怎么了:
while(!foo()) {
ros::spinOnce();
}
从逻辑上讲等同于:
while(true){
bool b = foo();
if(b){
break;
}
ros::spinOnce();
}
比以下简单得多
MYWHILE(true){
bool b = foo();
if(b){
break;
}
}