(有条件的?)在函数中创建局部变量

(Conditional?) creation of local variables in function

我遇到了这个[问题]:How can I store values into a multi-parameter struct and pass typedef struct to a function?。 我建议在 if 之前声明一个 dtErrorMessage 变量并将其用于两个条件,而不是声明两个不同的变量,如下所示:

// Initial version
if(GetTemperature() <= -20)
{
    dtErrorMessage low;
    low.errorCode=ERROR_CODE_UNDER_TEMP;
    low.temperature=GetTemperature();
    SendErrorReport(&low);
}

if(GetTemperature() >= 160)
{
    dtErrorMessage high;
    high.errorCode=ERROR_CODE_OVER_TEMP;
    high.temperature=GetTemperature();
    SendErrorReport(&high);
}


// My version
dtErrorMessage err;
int8_t temp = GetTemperature();       // Do not consider change during evaluation

if(temp <= -20)
{
    err.errorCode   = ERROR_CODE_UNDER_TEMP;
    err.temperature = temp;
    SendErrorReport(&err);
}
else if(temp >= 160)
{
    err.errorCode   = ERROR_CODE_OVER_TEMP;
    err.temperature = temp ;
    SendErrorReport(&err);
}
else
{
  // Do not send error report 
}

我的问题是:(在嵌入式方面,)我是对的,这样无论条件如何,都会在RAM中创建两个局部变量?因此,它会减少所需的 RAM,在 if 之前使用一个无条件变量声明,然后在两个条件下都使用它,对吗?

我找不到正确的术语来搜索自己得到这个答案。

具有自动存储持续时间的变量的生命周期是直到块结束。存储将得到保证,它将保留常量地址(即由 & 给出的地址)直到块结束,之后所有指向该对象的指针都将变得不确定。

C 标准 不是 lowhigh 必须占用相同的内存部分!必须保证存储到包含声明的块的末尾,但它也可以更长。另一方面,as-if 规则表示程序只需要表现得好像它是根据 C 标准规则为抽象机编译的程序,因此高质量的实现可能

  • 不在不同地址同时为lowhigh保留内存,
  • 不为 err 保留内存以防 else 分支被采用。

实际上使这两个的执行行为几乎相同。

主要是风格上的差异:在您的版本中需要键入的内容更少,而原始版本可以适应糟糕的编译器。