簡體   English   中英

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

[英]what's the meaning of exit code of program with empty void main()?

我制作了一個簡單的 C 程序,如下所示,主程序為空,並用 gcc 編譯

void main(){
}

執行時,它返回退出代碼為25 ,如果我添加一個 printf 語句,包含 stdio.h 后,它返回退出代碼5

這里的255是什么意思,為什么在 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 主要

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM