[英]what's the meaning of exit code of program with empty void main()?
我制作了一個簡單的 C 程序,如下所示,主程序為空,並用 gcc 編譯
void main(){
}
執行時,它返回退出代碼為25
,如果我添加一個 printf 語句,包含 stdio.h 后,它返回退出代碼5
這里的25
和5
是什么意思,為什么在 main() 之前或之后執行的任何代碼都會返回它? 如果我使用 int main() 並且不放置 return 語句,則退出代碼為零。
這里的 25 和 5 是什么意思
C 語言規范沒有定義main()
被聲明為返回void
的程序的行為。 盡管如此,接受此類代碼的實現可能會或可能不會為其定義行為。 因此,在一般意義上,退出狀態對於具有void main()
的程序沒有任何意義或意義。
顯然, GCC 確實接受了該代碼,但我在GCC 記錄的 C extensions中找不到其行為的定義,因此在這種特殊情況下,您觀察到的退出狀態都沒有任何意義。
以及為什么在 main() 之前或之后執行的任何代碼都會返回它?
沒有特別的原因。 行為未定義。
如果我使用 int main() 並且不放置 return 語句,則退出代碼為零。
那個案子是很好定義的。 C 指定如果執行到達對main()
的初始調用結束(假定使用兩個 C 標准簽名之一聲明,兩者都返回int
),那么行為就像調用了exit(0)
一樣。 這是一個特例。 如果執行到達非void
function 的右大括號,並且其調用者對返回值執行任何操作,則行為未定義。
(添加約翰·布林格的回答)
舊的 ISO C 標准 (ISO/IEC 9899:1999) 規定:
[main] 應被定義
- 返回類型為
int
和
- 沒有參數 […] 或
- 帶有兩個參數 […] 或等效參數; 或者
- 以其他一些實現定義的方式。
§ 5.1.2.2.1 ¶ 1 C 標准
如果返回類型與
int
不兼容,則返回給宿主環境的終止狀態是未指定的。
§ 5.1.2.2.3 ¶ 1
這表明允許不返回int
的 forms 是故意的。
許多編譯器手冊(例如 Watcom C/C++、IBM VisualAge C/C++、Microsoft Visual C/C++)聲明main
可能具有返回類型void
,因此具有void main()
的程序是符合標准的程序。
很長一段時間以來,很多代碼都是用void
返回類型編寫的。 gcc
(可能)認為與遺留代碼兼容很重要並允許void main()
但在這種情況下:
warning: return type of 'main' is not '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
寄存器(返回寫入 stream 的字符數, EAX
用於返回值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.