【问题标题】:Why does this give a (non zero) error code on termination?为什么这会在终止时给出(非零)错误代码?
【发布时间】:2018-09-11 13:52:40
【问题描述】:

此代码运行,甚至产生预期的输出。但是,在构建日志中,我总是得到Process terminated with status 2 (0 minute(s), 5 second(s)) 或此日志的某些变体。

代码-

#include<stdio.h>
#include<conio.h>

void main() {

printf("Please enter a character");
char ch = getch();

ch++;
printf("\n%c", ch);


} 

示例输出(输入是不带引号的“a”)-

Please enter a character
b

【问题讨论】:

  • 你为什么使用void main()?使用 int main() ,除非您的编译器文档明确提及其他内容。
  • 如果消息是在 build log 中输出的,那么它与 build 相关而不是 execution代码。您真的是指“构建日志”吗?您的构建是否也执行代码?这可以解释你的描述,但不寻常,值得解释。无论哪种方式,如果您以任何方式依赖或测试程序的退出值,您可能应该显式返回一个值 - 否则您为什么要测试它?

标签: c return-value main


【解决方案1】:

如果您将main 声明为int main(void)int main(int argc, char *argv[]),则当前的C 标准规定到达终止main} 返回值0。如果声明了main,这也成立返回类型与 int 兼容,但参数由 C 实现定义。

如果您声明 main 的方式不同,就像 void main() 一样,C 标准不会说明行为是什么,这取决于您的 C 实现。

【讨论】:

    【解决方案2】:

    首先,我建议检查What are the valid signatures for C's main() function?

    对于托管环境,void 不是 main() 的有效返回类型。

    话虽如此,根据此函数签名,返回类型为void,这表明对main() 的调用不会向调用者(环境)返回任何内容。现在,从环境中,尝试访问返回的值 [即,您得到的提示] 充其量是不确定的。 C 标准没有为此定义任何行为。

    【讨论】:

      【解决方案3】:

      由于您在没有有效签名的情况下声明了main(即您给它的返回类型为void),因此您不能假设任何关于实际返回给操作系统的值。如果您正在为 x86 架构进行编译,那么可能会发生什么来解释 2 的返回值:

      main:
          ...
          call printf
          add esp, 8
          ; return value from printf is in EAX register
          ret 
      

      printf 返回写入标准输出的字符数,在您的情况下为 2,格式字符串为 \n%c。当您从main 退出时,来自printf 的返回值仍在指定用于保存返回值的寄存器(EAX)中,所以这就是main 返回的内容。

      【讨论】:

        【解决方案4】:

        如果您不从 main 中返回任何内容,则可能会返回任何值。在您的情况下,您的程序将返回 2,如消息 (status 2) 中所示。您需要返回0 以通知其他程序您的程序运行成功。

        int main() {
           ....
           return 0;
        } 
        

        【讨论】:

        • C 标准规定,如果main 的返回类型与int 兼容并且控制到达终止main},则返回零。这是main的特殊规范,不同于其他功能。
        • 为了完成@EricPostpischil 所说的,最后的return 0; 对于main() 来说是隐含的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多