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在我的情况下,我检查了我在循环中收到的数据。我不知道如何将条件传递给依赖于函数本身中创建/接收的数据的函数。我将添加一段可测试代码。