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

标签 c local-variables

我遇到了这个[问题]: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 中创建两个局部变量?因此,它会在 if 之前使用一个无条件变量声明,然后将其用于两个条件,从而减少所需的 RAM,对吗?

我无法找到正确的术语来搜索以自行回答此问题。

最佳答案

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

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

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

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

差异主要在于风格上:在您的版本中,需要输入的内容较少,并且原始版本可以适应不良编译器。

关于c - (有条件?)在函数中创建局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57284257/

相关文章:

java - 在字段声明中使用 var

c++ - 内存管理 : scope and local pointer variable

c++ - 传递的局部变量 (C++)

c - 链接列表打印问题?

c - 注释/标识符是否会影响代码性能/可操作性?

c - 为什么 fseek 和 fputc 在我的程序中不起作用?

C 具有可变大小行的二维数组

java - 局部变量的线程安全

c - NDK - 扩展类并使用指向数组的指针会导致段错误

C 重复数组