2011-12-04 29 views
5

我剛剛編寫了一個計算一些事情的快速程序,當我遇到C程序的return語句/ exit語句時。是否需要在Main()中返回一個值?

我宣稱main()int類型,所以我將不得不放回一個整數,否則我的程序將無法正確編譯。但是,製造main a Boolean甚至void是可以接受的嗎?

我知道創建一個C程序的標準方式是返回一個值,因此可以排除任何問題,除此之外,但是Boolean不會以同樣的方式工作嗎?另外,我可以放棄聲明void,並且在操作系統終止後仍然運行我的程序時沒有問題嗎?

感謝您的幫助。

+0

沒有必要,但需要。 – Philip

回答

6

C99標準說:(§5.1.2.2.1程序啓動

稱爲在程序啓動的功能被命名爲主力。該實現聲明不具有此功能的原型 。它應具有的INT一個返回類型和不帶 參數來定義: 使用

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

或兩個參數(這裏稱爲argc和argv,雖然任何名稱可能是,因爲它們是地方到它們被宣稱的功能):

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

或同等的;或者以某種其他實現定義的方式。

因此,在託管環境中,int是唯一有效的標準返回類型。實現可以定義其他入口點。

注意,部分§5.1.2.2.3程序終止有這樣的:

如果主函數的返回類型爲int類型兼容,從所涉及的 初始調用的返回main函數相當於以main函數返回的值 爲參數調用exit函數; 達到}終止 主函數返回值0。如果返回類型與int不兼容,則返回到主機環境的終止狀態未指定。

所以你忽略從main返回是合法的C99,只要你main返回int
(但以前版本的C標準沒有對main的異常 - 返回沒有值(或沒有返回語句到達最終的})導致「返回到主機環境的終止狀態[將]未定義 「。)

+0

'或者其他一些實現定義的方式' - >這給解釋留下了很大的空間:-) – jdehaan

+0

@jdehaan:不是真的; 「實現定義」是指實現明確記錄的東西。 –

+1

值得一提的是,在C90中,達到'}'返回一個未定義的狀態。 –

0

調用main()的代碼期望它返回int(或調用exit())。您不能更改調用main()(它是操作系統或運行時的一部分)的代碼,所以最好返回int。

2

這是一個可能感興趣的link。似乎你的問題的答案並不那麼直截了當。我還看到編譯器(MS Visual C)接受void作爲返回類型。

+0

的確很有意思! – nmagerko

+1

「託管」和「獨立」實現有所不同。 OP應該被認爲是託管實施,所以他應該堅持標準。 Borland,Microsoft和Herb Schildt可能會用他們自己的語義來污染語言,但他們不應該將其命名爲「標準」。 – wildplasser

0

返回類型必須是int,正如其他答案所涵蓋的那樣。然而,假設你必須返回一個值,因爲這是錯誤的,main是個例外。 C99標準規定了這一點,所以在沒有使用return的情況下實現主機是完全正確的。

0

在ANSI C中,main()通常返回類型爲int,但它實際上可以是實現定義的;這意味着不同的編譯器和平臺接受不同的簽名,但int main()int main (int, char**)都是保證按標準格式良好。

它不像其他非void函數不同,它不需要return語句。如果沒有提供,並且返回類型被指定爲int,那麼該程序編譯好像在main()中的最後一個語句之後有一個隱含的return 0;

標準的相關部分:

5.1.2.2.3計劃終止

如果main函數的返回類型與int兼容的類型,return從 到main函數的初始調用相當於調用exit函數,並使用由返回的值作爲其論點;到達}終止 main函數返回值0。如果返回類型與int不兼容,則未返回到主機環境的終端狀態 未指定。

不要引用我這一點,但在K + R,然而,事情有點寬鬆,我認爲甚至沒有需要指定返回類型,所以main() { }居然是有效的K + R程序。

+0

'int main(void)',而不是'int main()'。在K&R C(1989年ANSI C/1990 ISO C)中,如果你省略了返回類型,它默認爲'int'。該規則在1999年的ISO C標準中下降了。利用它永遠不是一個好主意。 –

+0

對,當然。我認爲我的C++正在顯示... – Halfbin

1

摘要:您不一定非要,但您應該。

在C90中,在沒有執行return語句的情況下到達main()的末尾,「返回到主機環境的終止狀態未定義」。至少在我使用過的一個系統上,返回的狀態是1,在那個系統上表明程序失敗。

C99增加了一個新規則,說到main()的末尾返回0.(C++有相同的規則。)並非所有的編譯器都完全實現了C99,並且那些默認情況下默認行爲不像默認的C99編譯器。

可以從main()返回唯一的便攜式的值是0,EXIT_SUCCESS,和EXIT_FAILURE(後兩者都在<stdlib.h>定義0和EXIT_SUCCESS指示該節目成功(和EXIT_SUCCESS通常被定義爲0); EXIT_FAILURE表示程序失敗return 1;很常見,但不可移植;我在一個系統(VMS)上工作,終止狀態爲1表示成功,如果您希望程序是可移植的,請使用EXIT_FAILURE表示失敗;這就是這對一些系統和程序定義其他或特定應用系統特定的狀態代碼。

對於便攜性(和,恕我直言,風格),最好在main()的盡頭做一個明確的return 0;,雖然在任何情況下都不需要。添加一行代碼(最壞的情況是無害的)要比浪費時間確定是否需要更容易。

注意,對於main()正確的定義是:

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

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

或同等學歷(例如,你可以寫char **argv而非char *argv[])。 int main() { /* ... */ }是否有效是值得懷疑的,因爲我不會在這裏進行微妙的理由。同樣,添加void關鍵字比確定是否需要它浪費時間更容易。

了大量的書籍和教程使用void main()void main(void)。一個特定的編譯器可能會選擇允許這樣做,但它不是可移植的。在書或教程中看到void main是一個很好的信號,表明作者不太瞭解C標準,並且您應該找到其他東西來學習。

相關問題