C 做而宏/函数具有不同的条件

C 做而宏/函数具有不同的条件,c,C,我有以下代码: /* some calculation */ do { /* data acquire and calculation */ } while (CONDITION); 我的情况如下所示: (( A || B ) && C ) ( A && C ) 注意,我将这些条件与A、B和C的不同语句一起使用。但是,预计算和循环中的所有内容始终是相同的。我在代码中多次使用此块,并想知道是否有可能将其放入define或函数中,以使代码看起来更干净 有没有一

我有以下代码:

/* some calculation */
do {
  /* data acquire and calculation */
} while (CONDITION);
我的情况如下所示:

(( A || B ) && C )
( A && C )
注意,我将这些条件与A、B和C的不同语句一起使用。但是,预计算和循环中的所有内容始终是相同的。我在代码中多次使用此块,并想知道是否有可能将其放入define或函数中,以使代码看起来更干净

有没有一种好的、合理的方法来实现不同语句的循环

我已经考虑过在while循环中调用函数

while (DoMyLoop( CONDITION, calculationParams ));
但有了这个解决方案,我就不会在一行程序中进行预先计算了

我怎样才能在一个漂亮的单行程序中获得我的代码块(如果需要,可以使用更多代码块,只要代码块易于理解和维护)


一些附加(可能不相关)信息:

在我的循环中,我接收一个字节数组,根据具体情况,我必须循环,直到某个特定的位发生变化,因此
a或B

C
是一种超时条件

下面是一些带有变量的代码

unsigned char data[10] = { 0 };
long intervalMS = 0;

/* precalc */
gettimeofday( &stopTimeout, NULL );
gettimeofday( &startTimeout, NULL );

do {
  receiveCall( data );
  gettimeofday( &stopTimeout, NULL );
  intervalMS = (stopTimeout.tv_sec - startTimeout.tv_sec) * 1000 +
             (stopTimeout.tv_usec - startTimeout.tv_usec) / 1000;
} while ( (data[0] & 0x01) && intervalMS < 200);
无符号字符数据[10]={0};
长间隔=0;
/*预信用证*/
gettimeofday(&stopTimeout,NULL);
gettimeofday(&startTimeout,NULL);
做{
接收呼叫(数据);
gettimeofday(&stopTimeout,NULL);
间隔=(stopTimeout.tv_sec-startTimeout.tv_sec)*1000+
(stopTimeout.tv_usec-startTimeout.tv_usec)/1000;
}while((数据[0]&0x01)&&intervalMS<200);

条件的A部分也可能类似于
((数据[2]&0x02)|数据[3]==0x12)

下一个解决方案如何

for (precalculation (); CONDITION; somethingWith (calculationParams));
precalculation()
执行一次,在每次迭代时对条件进行评估,并用
something(calculationParams)
代替增量。
for
循环的主体为空

纯粹的C美


显然,预计算和somethingWith(calculationParams)必须成为一个新函数。

首先,请注意,
do{},而(something)
相当于
something=true;而有些东西{}
。前者节省了一点额外的执行,以防您不需要初始化部分

我怎样才能在一行程序中得到我的代码块呢

你的代码没有问题<代码>}while((数据[0]&0x01)和间隔<200)对我来说非常清楚-另一个C程序员

检查lsb是否已设置,并检查计时器间隔。这段代码可以改进的唯一方法是解释为什么要检查lsb——这可以通过注释来完成(检查数字是否为奇数,或者在位字段中读取位等)


现在,您可以而且应该做的是将整个代码段放在函数中,并给它一个有意义的名称。有一个很好的单行程序。

使用宏时,实际的LOC不会减少,不管怎样,编译器也不会减少。宏还会使代码更难阅读、理解和维护。宏也很容易出错,导致未意识到的意外后果。您可以参考Linux内核中如何实现列表,它们在某些情况下具有非常复杂的结构,但它们为程序员提供了一个非常简单的接口,例如:
list\u for_each\u entry()
,你可以参考这个例子。虽然是单行调用,但在展开宏后不会减少LOC。您可以在include/linux/list中找到此示例的定义。h@Someprogrammerdude我知道实际的LOC是相同的,但是我认为如果你有一个合理的一行代码,而不是重复出现的15行代码,那么代码看起来更干净。那么函数有什么问题吗?@Someprogrammerdude在我的情况下,我检查了我在循环中收到的数据。我不知道如何将条件传递给依赖于函数本身中创建/接收的数据的函数。我将添加一段可测试代码。