在另一个函数中调用C / C ++函数时,为什么要堆栈?有办法解决吗?

时间:2018-02-17 10:15:15

标签: c++ c

当我遇到一种非常奇特的行为时,我正在编写一个非常简单的C / C ++程序。

按顺序调用任意两个函数时,它们按照调用它们的顺序运行。例如,如果我打印出字符串“hello”然后打印字符串“world”,我希望在控制台中打印字符串“helloworld”,这通常会按预期发生。

但是,当在另一个函数的调用中调用两个函数时,它们以相反的顺序执行。这在以下代码中进行了演示:

#include <iostream>
#include <stdarg.h>
void collector(int n, ...)
{
    va_list args;
    va_start(args, n);
    for (int i = 0; i < n; i++)
    {
        int elem = va_arg(args, int);
        // Do something with the returns
    }
    va_end(args);
    return;
}

int printAndReturn(const char *message)
{
    std::cout << message << std::endl;
    if (message == "foo")
    {
        return 1;
    }
    return 0;
}

int main(void)
{
    collector(2, printAndReturn("foo"), printAndReturn("bar"));
    printAndReturn("foo");
    printAndReturn("bar");
    return 0;
}

运行这个简单程序的预期输出是:

  

FOO

     

     

FOO

     

相反,我在控制台中看到的实际输出是:

  

     

FOO

     

FOO

     

我不明白为什么会这样。这与编译C / C ++的方式有关吗?

这个问题的答案是肯定还是否定,是否可以修复而不必颠倒函数调用的顺序?

非常感谢您的时间和精力。 :)

0 个答案:

没有答案