我编写了一个简单的代码,声明 21 个局部变量并执行++ 操作,以便编译器不会显示错误。 但问题是,当我继续调试时,我的本地显示该值不可用或错误,但寄存器窗口显示我的操作已正确完成。我使用 IAR IDE for arm ,我正在使用 ARMv7 cortex M4 。
代码是:
int main(){
int C1=0;
.
.
.
int C21=0;
C1++;
.
.
.
C21++;
}
最佳答案
局部变量可以放置在寄存器中并且永远不会到达内存。局部变量可能位于堆栈上。局部变量可能存储在其他地方。
C 标准没有指定这样的事情。该标准仅讨论变量的生命周期,即访问变量的有效时间。堆栈的概念甚至不是标准的一部分 - 换句话说,兼容的 C 实现不需要有堆栈。
只要不改变程序的可观察行为,编译器就可以进行各种优化。我认为这正是您的情况所发生的情况,因为这包括让不再使用的变量变得不可用。
示例:
int a, b;
for (a=0; a<10; ++a)
{
// Do something not involving variable b
}
for (b=0; b<10; ++b)
{
// Do something not involving variable a
}
在这种情况下,编译器可以对变量a
和b
使用相同的寄存器。在第二个循环开始之前,变量 b
将“不可用”,而当第二个循环开始时,变量 a
将“不可用”。这将是一个完美有效的编译器优化。
一般来说:当调试器说“不可用”或“优化”或类似内容时,这意味着该变量不再使用(即未存储在任何地方)。
您可以尝试在返回之前添加所有变量的打印。通过这种方式,编译器可能(但仍不能保证)保持变量可用,以便您可以在调试器中看到它们。
但是,由于您的程序不会产生任何输出,因此编译器可以将其优化为 return 0;
关于C编程为什么++操作后局部变量在调试器中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280769/