带延迟函数调用的while循环宏

时间:2019-05-23 19:34:02

标签: c++ while-loop preprocessor

我想构造一个宏,每次循环结束迭代时,都会调用一个预定义的函数(在此由“这里调用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语言-代码也可以。

3 个答案:

答案 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;
    }
}