当前位置: 首页 > 知识库问答 >
问题:

带有空void main()的程序的退出代码是什么意思?

郜杰
2023-03-14

我用下面给出的空main编写了一个简单的C程序,并用gcc编译了它

void main(){
}

执行时,它返回退出代码作为25,如果我在包含stdio之后添加printf语句。h、 它返回退出代码5

这里255的含义是什么,以及为什么它由在main()之前或之后执行的任何代码返回?如果我使用int main(),并且不放置返回语句,则退出代码为零。

共有2个答案

濮阳振
2023-03-14

(补充约翰·博林格的回答)

旧的ISO C标准(ISO/IEC 9899:1999)指出:

[main]应进行定义

  • 返回类型为int

§5.1。2.2.C标准的第1部分

如果返回类型与int不兼容,则返回到主机环境的终止状态未指定。

§5.1。2.2.3¨1

这表明允许不返回int的表单是故意的。

许多编译器的手册(例如。Watcom C/C,IBMVisualage C/C,Microsoft Visual C/C)声明main可能具有返回类型vol,因此具有vol main()的程序是符合要求的程序。

很长一段时间以来,许多代码都是用space的返回类型编写的。gcc(可能)认为与遗留代码兼容很重要,并允许无效main(),但在这种情况下:

  • 它给出一个警告(警告:“main”的返回类型不是“int”

参考资料:

  • http://web.archive.org/web/20160604095048/homepage.ntlworld.com/jonathan.deboynepollard/FGA/legality-of-void-main.html

int main(){}

这在C89/90中未定义,在以下版本中定义良好(返回0)。

在x86上,EAX寄存器通常用于返回值。所以呢

int main() {}

被编译成类似于:

main:
        push    rbp
        mov     rbp, rsp
        mov     eax, 0
        pop     rbp
        ret

对于

void main() {}

最简单的操作是删除mov eax,0

main:
        push    rbp
        mov     rbp, rsp
        nop
        pop     rbp
        ret

如果添加printf语句:

#include <stdio.h>

void main()
{
  printf("1234");
}

你会得到:

.LC0:
        .string "1234"
main:
        push    rbp
        mov     rbp, rsp
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        pop     rbp
        ret

printf调用更改EAX寄存器(返回写入流的字符数,EAX用于返回值)。

尉迟明辉
2023-03-14

这里25和5是什么意思

C语言规范没有定义其main()声明为返回false的程序的行为。然而,接受此类代码的实现可能会也可能不会为其定义行为。因此,在一般意义上,没有退出状态具有任何意义或意义的程序与无效main()

显然,GCC特别接受代码,但是我在GCC的文档化C扩展中没有找到对其行为的定义,所以在这种情况下,您观察到的退出状态也没有任何意义。

以及为什么它由在main()之前或之后执行的任何代码返回?

没有特别的原因。该行为未定义。

如果我使用int main(),并且不放置返回语句,则退出代码为零。

这种情况定义明确。C指定如果执行到达对main()(假定使用两个C标准签名之一声明,两个签名都返回int)的初始调用的末尾,则行为就好像调用了exit(0)。这是一个特例。如果执行到达非void函数的右大括号,并且其调用者对返回值执行任何操作,则该行为是未定义的。

 类似资料:
  • 问题内容: 因此,我一直在尝试通过bash提示进行自定义,以使其看起来像 颜色。我设法获得了恒定的颜色(每次看到提示时,颜色都是相同的),但是如果最后一个命令的退出状态为非零,我希望用户名(“ feralin”)显示为红色,而不是绿色。我想出了: 但是,从我的观察来看,运行时似乎只对一次求值,然后永远替换结果。即使最后一个退出代码为非零(如),这也使名称始终为绿色。这是怎么回事吗?还是提示出现其他

  • 几分钟前它运转良好。现在,我在尝试从Appium桌面启动应用程序时,在Appium桌面应用程序中遇到以下错误。 Appium桌面:版本1.10.0 [UiAutomator]启动UiAutomator[UiAutomator]移动到状态'启动'[UiAutomator]解析uiAutomator jar[UiAutomator]找到jar名称:'AppiumBootstrap.jar'[ADB]运

  • 以下代码中的“-97”是什么意思? 我们创建了一个由26个LinkedList组成的数组来模拟字典。每个列表包含以“a”、“b”、“c”、......“z”开头的所有单词。代码是由讲师给出的。 这里是附注: 在特定MyLinkedList中搜索单词的步骤 假设要搜索的单词位于名为wordstr的String类型变量中。 将允许您跳转到正确的链接列表,并且包含将返回true/false,这取决于单词

  • 在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?

  • 问题内容: 从这里 我没有得到它的含义以及为什么使用它。我试图搜索它,但不了解其含义。 问题答案: 它使动态加载的模块可以访问符号(前提是所述模块添加了声明)。

  • 问题内容: 该文档提到 您可以使用过滤器来找到状态为137的退出容器,这意味着SIGKILL(9)杀死了它们 我想知道退出状态255意味着有什么特别的吗? 问题答案: 如果您在docker ps上看到此状态,显示状态为“ ” 的容器,则表示其主要入口点/命令进程已停止并显示该状态。 255只是意味着“有一个错误”,但除此之外并没有告诉您太多信息。