C++如何重用具有多个返回(退出点)的代码块?

标签 c++ macros readability

我有一个执行运动控制程序的代码块。基本上,它要求伺服电机移动到特定位置。

//code block starts

err=setVelocity(vel);
if(err!=0) return ERR_FAIL;
err=setAcceleration(acc);
if(err!=0) return ERR_FAIL;
err=setDeceleration(dec);
if(err!=0) return ERR_FAIL;
err=setPosition(pos);
if(err!=0) return ERR_FAIL;
err=startMotion();
if(err!=0) return ERR_FAIL;

//code block ends

代码块用于,例如,归巢过程。

#define ERR_SUCCESS      0
#define ERR_FAIL         1

short GoHome(){

long vel,acc,dec,pos;
short err;

//Move to home
//code block starts
vel=vel1,acc=acc1,dec=dec1,pos=pos1;
...
//code block ends

//Move to offset
//code block starts
vel=vel2,acc=acc2,dec=dec2,pos=pos2;
...
//code block ends

return ERR_SUCCESS;
}

每次我需要这个“移动到”程序时,我都必须复制粘贴这个代码块,只修改运动参数。实际的代码块比上面显示的要大得多,这就是为什么我不知道将它定义为 MACRO 是否是个好主意。

其实我确实定义了一个宏来处理错误。

#define IfErrThenReturn(err){  \
CString errInfo;               \
if(err!=0){                    \
    switch(err){               \
    case 0: errInfo = "Command succeeded.\n"; break;        \
    case 1: errInfo = "Command failed.\n"; break;           \
    case 2: errInfo = "Unsupported license.\n"; break;      \
    case 3: errInfo = "Parameter Error.\n"; break;          \
    ...                        \
    }                          \
    AfxMessageBox(errInfo);    \
    return EM_ERR_FAIL;        \
}                              \

所以代码块会像

//code block starts

err=setVelocity(vel);
IfErrThenReturn(err);
...

//code block ends

但我不知道将整个代码块定义为宏是否明智。有人能告诉我是否有其他方法可以提高更高级别程序的可读性,例如使用代码块的“GoHome”?

最佳答案

编写代码时,使其美观和可读性始终很重要,这样以后的维护就不会出现问题。宏没有提供保持代码可读性的好方法,因为宏调用被替换为宏主体本身,这也可能导致错误行为和意外结果。

将它放在函数中更容易:

#define ERR_SUCCESS      0
#define ERR_FAIL         1

bool relocate(long vel, lon acc, long dec, long pos)
{
    int err=setVelocity(vel);
    if(err!=0) {
        return false;
    }

    err=setAcceleration(acc);
    if(err!=0) {
        return false;
    }

    err=setDeceleration(dec);
    if(err!=0) {
        return false;
    }

    err=setPosition(pos);
    if(err!=0) {
        return false;
    }

    err=startMotion();
    if(err!=0) {
        return false;
    }

    return true;
}

short GoHome()
{

    //Move to home
    if(!relocate(vel1, acc1, dec1, pos1)
    {
        return ERR_FAIL;
    }

    //Move to offset
    if(!relocate(vel2, acc2, dec2, pos2)
    {
        return ERR_FAIL;
    }
    return ERR_SUCCESS;
}

这样就不需要复制/粘贴代码,没有不需要的变量声明,并且您有一个函数将所有必需的功能收集在一个地方

关于C++如何重用具有多个返回(退出点)的代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689563/

相关文章:

c# - 引用平等表现差异? ((object)obj1 == (object)obj2) 与 object.ReferenceEquals( obj1, obj2 )

c++ - 没有显示浮点值?

java - 与Java中可用的Scala 2.10宏相比

c - 大多数嵌入式 C 编译器如何为内存映射 I/O 定义符号?

c++ - 写入 bool 条件 "in full"是否会影响性能?

haskell - 有没有更干净、优雅的 Haskell 方式来编写这个 LCM 函数?

c++ - 如何在 Linux 上获取 C++ 代码块的时钟滴答? clock() 结果没有意义。

c++ - 在 C++ 中声明指针时,我将星号放在哪里有关系吗?

c++ - 指向 std::map 中的值的指针

c - 以下代码的输出 - c 中的宏