1

我正在运行包含 g++ 的最新 cygwin。

在我看来,一个函数调用正在被优化,即使编译器标志包括 -O0。

从此循环调用该函数(示例中的所有代码都已简化):

void my_func ( void )
{
    for ( int i = 0; i < 2; i++) {
        var1 = table[i];
        printf("i = %d\n", i);
        function_to_call();
        printf("Called the function\n");
     }
}

它调用的函数如下:

void function_to_call()
{
   int internal_var = var1;
   // do some math using internal_var, passing the result
   // as an input to another function

   printf("var1: %d\n", internal_var);
}

运行它,输出将是:

i = 0
var1 = 0
Called the function
i = 1
Called the function

为什么会这样?我希望每次通过循环调用 function_to_call() 。这是编译器输出的摘录,直接取自标准输出:

 g++ -O0 -Wall -Wno-write-stings -Wextra
4

2 回答 2

1

首先,您发布的只是图片的“一部分”,因为您的示例输出function_to_call()有一段时间的输出是. 不过,如果我不得不尝试解决这个问题......var1: ...var1 = ...

void function_to_call()
{
   int internal_var = var1;
   // do some math using internal_var, passing the result
   // as an input to another function

   printf("var1: %d\n", internal_var);
}

我猜想“做一些数学......”部分正在迫使提前返回;但是,只有当输入(可能作为全局变量在 中传递var1)设置为特定值时。

于 2012-09-14T16:22:23.240 回答
0

你们是对的,我发布了一个不完整的代码示例。该函数实际上没有任何返回语句,但我找到了罪魁祸首。function_to_call() 中的代码位于状态机中。发生的事情是在该代码完成之前状态已更改,因此下一次通过它进入了不同的情况。我向所有人道歉,并吸取教训。我感谢你的努力。

于 2012-09-14T18:02:48.437 回答