2017-08-07 55 views
-1

我寫了下面的代碼:void main(){}在沒有頭文件的情況下完美工作。這怎麼可能發生,用C寫的主函數的定義在哪裏?

void main() { 

} 

它如何運行,沒有任何的頭文件?

+3

你必須編寫'main()'的定義,並且做到了。 –

+0

所以是printf.But我們有它,main()@FilipKočica –

+0

你需要運行一個C程序的唯一東西是一個'main'函數,在沒有包含頭文件IO,但你不需要它們 –

回答

6

C標準(5.1.2.2.1程序啓動)

1名爲在程序啓動的功能被命名爲主力。 T 他 實現聲明此函數沒有原型。應當 帶有int返回類型和不帶參數定義:

int main(void) { /* ... */ } 

或具有兩個參數(此處稱爲argc和argv,儘管可以使用任何 名稱,如他們是本地的中,他們 聲明的功能):

int main(int argc, char *argv[]) { /* ... */ } 

或等同物; 10)或以某種其他實施方式定義的方式。

雖然一些編譯器,例如MS VS的編譯器支持與返回類型void然而這樣的聲明函數main的聲明並不是函數main的C標準聲明。

因此,如果實現聲明沒有函數main的原型,並且如果函數main不調用任何其他函數,則不需要頭。

你可能只寫

int main(void) 
{ 
} 

return語句也可以省略。

請注意,它是定義函數main的用戶。所以在上面介紹的程序中有一個main函數的定義,它的主體中不包含任何語句。該函數不會執行任何操作,並立即將控件返回到託管環境。

+0

什麼讓你認爲這是一個託管環境?看到這個:https://stackoverflow.com/a/31263079/584518 – Lundin

+0

@Lundin如果它不是託管環境,那麼問題的作者提到了這一點。 –

+0

我的觀點是它引用了關於託管環境的_sub-chapter_,忽略了其他形式的main()是完全正確的。所以這個報價並不能證明main()的格式,只是顯示了託管系統的一些通用格式。 – Lundin

1

如果您的代碼中沒有標頭使用printf,編譯器不知道您要引用的是哪種類型的實體。

如果您提供main,編譯器確切知道這意味着什麼,您只是指定它。

2

void是一種內置類型,由編譯器知道。 main是程序的入口點,而你寫的printf需要一些原型。如果您在源代碼中編寫自己的printf定義,它將在沒有標題的情況下編譯。

編譯C程序唯一要做的就是指定一個入口點,即main

標題只是提供其他IO的可能性。

void printf() 
{ 

} 

int main() 
{ 
    printf(); 
} 
+2

並且用'void'聲明'main'具有未定義的/實現定義的行爲,所以它根本不需要工作。重新定義'printf'也有不確定的行爲。 –

+1

Ofc我知道它,它只是解釋這些程序編譯是如何工作的,你不能將實現定義/未定義行爲等東西糾纏到初學者頭部。感謝downvote無論如何:-)。 –

+0

關鍵是它是完全有效的*不*編譯 –

4

頭文件只是一種語言功能,它提供了在不同模塊(翻譯單元)或甚至整個庫中組織代碼的方法。它們絕不是強制性的使用。

C程序中唯一強制的要求是有一些入口指向你的程序的方式。在託管系統(例如具有OS的PC)上,該入口點必須是名爲main()的函數。它可以用幾種方式來聲明。 void main()不保證工作,除非編譯器明確支持該表單。最便攜和標準化的格式是:

int main (void) 
{ 
    return 0; 
} 

當然,這個程序當然不是很令人興奮的運行,因爲它什麼都沒有。但它是完全有效的。

不需要main()的任何前向聲明。對於獨立環境,入口點的格式完全由實現定義。對於託管環境,C標準明確指出:「該實現沒有聲明該函數的原型。」 - 這種情況下的實現意味着編譯器。用英語表示main()函數必須在沒有任何以前的聲明的情況下工作,按照語言定義。

Details regarding the various allowed forms of main()

+0

另請注意,'void main()'是一種過時的格式,在未來的語言版本中可能無法使用。只有'void main(void)'保證將來能夠工作。 – Lundin

相關問題