我用下面给出的空main编写了一个简单的C程序,并用gcc编译了它
void main(){
}
执行时,它返回退出代码作为25
,如果我在包含stdio之后添加printf语句。h、 它返回退出代码5
这里25
和5
的含义是什么,以及为什么它由在main()之前或之后执行的任何代码返回?如果我使用int main(),并且不放置返回语句,则退出代码为零。
(补充约翰·博林格的回答)
旧的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”
)
参考资料:
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
用于返回值)。
这里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,这取决于单词
在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?
b & 0xFF for b in这个怎么理解
问题内容: 从这里 我没有得到它的含义以及为什么使用它。我试图搜索它,但不了解其含义。 问题答案: 它使动态加载的模块可以访问符号(前提是所述模块添加了声明)。