1

这实际上让我很烦恼。问题是这样的:如何将程序的退出状态设置为任何值,而无需在 gcc/g++ 中显式使用返回/退出? 让我们考虑这段代码:(从标准输入获取输入并将其打印到标准输出,直到遇到零输入 0)

#include <stdio.h>

int main() {
  int n;
  while(scanf("%d",&n) && n>0 )
    printf("%d\n",n);
}

在我的系统(即windows + mingw)中,它返回 1,如何在不显式使用 exit/return 的情况下使其隐式返回 0 或其他任何内容?

编辑 :

我稍微修改了代码:

int f(int n) { 
  return (n>0);
}

int main(){
  int n;
  while(scanf("%d",&n)&&f(n))
    printf("%d\n",n);
}

它现在隐式返回 0,但我无法从中得出任何确定的结论。

4

3 回答 3

2

我认为您的实现正在使用 main() 内部调用的最后一个函数的返回值——当然,这不是您可以依赖的行为。(并且可能会随着编译选项而改变,即内联)

(这可能是由于 EAX 寄存器中留下的值,正如评论中提到的那样。)

我能想到的最好的:

static int program_exit_value;

void setExitValue(int value)
{
    program_exit_value = value;
}

int main(void)
{
    ...

    return program_exit_value;
}

它使用一个return语句,但具有符合 ANSI 的优点。

于 2010-02-24T11:30:16.593 回答
2

在 C++ 和 C99 中,离开 main 而不执行 exit() 或 return 应该等效于 return 0(参见 5.1.2.2.3 for C,3.6.1/5 for C++),如果我没记错的话,C89 未定义。

于 2010-02-24T09:02:03.343 回答
0

关键是您的程序最终将终止 - 例如,运行时将ExitProcess()在 Windows 上调用或在另一个操作系统上调用等效函数。用于结束程序的原语将设置错误代码(退出状态),该代码将直接覆盖您之前设置的代码。

也许有一些 C++ 运行时实现允许你想要什么,但总体而言,行为与我上面描述的一样。

于 2010-02-24T08:12:18.800 回答