C++ &引用;我";在当前上下文中不可用

C++ &引用;我";在当前上下文中不可用,c++,debugging,gcc,gdb,codeblocks,C++,Debugging,Gcc,Gdb,Codeblocks,我第一次尝试调试工具时遇到了以下问题: 当我使用调试器一步一步地检查代码时,当我进入函数ComputeInterest()并将watch置于I(标记I并右键单击它)时,watch会通知我 “i”在当前上下文中不可用 我也很好奇为什么watch没有将I放入局部变量。这是我的代码: #include <iostream> double computeInterest (double base_val, double rate, int years) { double fina

我第一次尝试调试工具时遇到了以下问题:

当我使用调试器一步一步地检查代码时,当我进入函数
ComputeInterest()
并将watch置于
I
(标记
I
并右键单击它)时,watch会通知我

“i”在当前上下文中不可用

我也很好奇为什么watch没有将
I
放入局部变量。这是我的代码:

#include <iostream>

double computeInterest (double base_val, double rate, int years)
{
     double final_multiplier;
     for ( int i = 0; i < years; i++ )
     {
          final_multiplier *= (1 + rate);
     }
     return base_val * final_multiplier;
}

int main ()
{
     double base_val;
     double rate;
     int years;
     cout << "Enter a base value: ";
     cin >> base_val;
     cout << "Enter an interest rate: ";
     cin >> rate;
     cout << "Enter the number of years to compound: ";
     cin >> years;
     cout << "After " << years << " you will have " << computeInterest( base_val, rate, years ) << " money" << endl;
}
#包括
双计算利息(双基值,双倍费率,整数年)
{
双末级乘法器;
对于(int i=0;ibase\u val;
速率;
不能>年;

cout
i
已定义且仅存在于该范围内(for循环):

for(int i=0;i
因此,一旦您进入其中一行,您将能够检查“i”。一旦您退出此循环,
i
将再次不可用

编辑:

确保生成时没有优化(-O0)和调试信息(-g)编译标志

EDIT2:


这也可能是GDB的问题。因为如果我没记错的话,我也使用过GDB v7.5.1,并且有相同的行为。也许在更高版本的GDB上,您会得到预期的行为。正如下面的评论中所提到的,GDB v7.9的行为与您预期的一样。

您是否尝试在
for
语句之外声明
I
仅存在于该循环内。请在
for
循环内的
i
的作用域仅在
for
本身的范围内。很可能在您查看
i
时,它已不存在。即使将
i
放在循环外,编译器也可能(如果不是调试版本,则应该是这样)请注意,
i
已不再使用,请将其删除。由于这是一个非常简单的循环,
i
可能只存在于寄存器中,并且在不需要时会完全丢失。顺便说一句,您的问题是您忘记初始化
最终乘法器
。如果启用了足够高的警告级别,您的compiler可以为您节省四天的工作时间。实际上,您可以在函数中的任何位置在
i
上添加一个观察点。循环范围不应该是一个问题。@BaummitAugen我不确定。这可能取决于编译器版本和调试器。因为我也有这样的调试行为,而且通常调试器能够一旦进入相关范围,就检测监视的变量。我刚刚用gdb 7.9成功地尝试了它,但我想7.6也应该足够好。@BaummitAugen可能是gdb的问题。因为我想我用过gdb 7.5.1(如果我没记错的话)GDB 7.6的MinGW端口未能发现
i
 for ( int i = 0; i < years; i++ )
 {
      final_multiplier *= (1 + rate);
 }