C語言的main函數到底該怎麼寫

2021-02-23 C語言與C++編程

來自:編程珠璣(微信號:shouwangxiansheng)

前言

從開始學習C語言到現在,我們似乎看到了很多個版本的main函數,那麼哪一種才是正確的呢?我們先來看看目前有哪些版本。

main函數版本

第一種,沒有返回值,沒有入參:

main()

在C89標準中,這種寫法是可以接受的,但使用現在的編譯器編譯時,會報告警,並且會將其返回值默認為int。實際上,如果函數沒有顯式聲明返回類型,那麼編譯器會將返回值默認為int。

第二種,返回值為void,沒有入參:

void main()

這種形式的來源不得而知。但是為何這麼多初學者使用?main函數的返回值最終會作為程序的退出狀態,而一旦聲明為void,在程序退出後,想要獲取其退出狀態也就不可以了。因此不建議其返回值為void。

第三種,返回值為int,參數為void:

int main(void)

這是常見的一種寫法。形參為void,表明它在調用的時候不能傳入任何參數,那麼它也就不能獲取命令行參數了。

第四種,返回值為int,沒有參數:

int main()

看起來似乎和第三種沒有什麼區別,但這種形式卻有些許不同。雖然它的聲明沒有入參,實際調用卻可以傳入參數,看下面的例子:

#include<stdio.h>
void  test();
int main() 

    test(4);
    return 0; 
}
void test(int a)
{
    printf("%d",a);
}

對於上面的程序,我們仍然可以編譯並正常運行,test函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的。

第五種,返回值為int,有兩個入參:

int main(int argc,char *argv[])

這也是最常見的一種寫法。第一個入參為命令行參數個數,第二個入參為命令行參數數組。通常用於實現需要從命令行獲取參數的功能。

第六種,返回值為int,有三個入參:

int main(int argc,char *argv[],char *envp[]

這種和第五種相似,但多了一個參數,用於獲取環境變量,這種形式多源於編譯器的擴展。但全局變量environ可以代替envp的作用,獲取或者設置環境變量可以使用getenv或putenv,因此也沒有必要使用該形式。

沒想到吧,仔細數一數竟然有這麼種寫法?但是真相究竟如何?到底使用哪種呢?

真相大白

C89/C99/C11標準文檔中只提供了兩種main函數的寫法

int main(void) {  }

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

也就是說,其他的寫法都是不符合標準的,有的是歷史遺留問題,有的是編譯器擴展,更有的不知從何而來。當然對於帶參數的寫法,其參數名可自定義。另外對於除標準提供的以外的寫法,不同的編譯器有不同的處理策略,有的可能編譯不過,有的可能報警告,但一個「正經」的編譯器是不會對標準提供的形式產生質疑的。

總結

至此,我們已經知道了c語言main函數的寫法,我們來總結一下前面的內容:

C標準只提供了兩種main的形式,即前面提到的第三種和第五種。

為了代碼的通用可移植性,建議採用標準提供的形式。

不需要命令行參數可採用第三種,需要命令行參數採用第五種。

如果一個函數確定無需傳入任何參數,那麼用void限定是一個不錯的選擇。

函數沒有聲明返回值時,編譯器默認其返回值為int。

  

●編號385,輸入編號直達本文

●輸入m獲取文章目錄

分享C/C++技術文章

相關焦點

  • C語言 main 函數到底怎麼寫是對的?
    各位,C語言中的main函數大家都再熟悉不過了,這是你學習C語言首先就要學習的東西,但是我看過很多人寫的代碼包括我們的一些讀者在main函數的寫法方面版本很多
  • 深度剖析C語言的main函數
    在本文的最後,測試一下:  test.c:#include <stdio.h>int main(){    printf("c 語言");    return 11.1; }➜  testSigpipe git
  • 深度剖析C語言的main函數
    ()那既然main函數只有一種返回值類型,那麼是不是可以不寫?/a.out && echo "hello world"  #&&與運算,前面為真,才會執行後邊的c 語言可以看出,作業系統認為main函數執行失敗,因為main函數的返回值是11➜  testSigpipe git:(master
  • 乾貨 | 深度剖析C語言的main函數
    ()那既然main函數只有一種返回值類型,那麼是不是可以不寫?/a.out && echo "hello world"  #&&與運算,前面為真,才會執行後邊的c 語言可以看出,作業系統認為main函數執行失敗,因為main函數的返回值是11➜  testSigpipe git:(master
  • 你有沒有想過,C語言 main 函數到底為啥這麼寫?
    但凡是學過C語言的人,都知道要先寫main函數,然而很多時候我們看到的main函數卻各有差異,這究竟是為啥?哪種是對的呢?今天我們就來聊聊main函數。那麼main函數一共有多少個版本呢?0;}void test(int a){printf("%d",a);}程序仍然可以正常運行,test函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的
  • C語言必須寫main函數?最簡單的 Hello world 你其實一點都不懂!
    :我們打眼一看,其實很簡單,就是引入頭文件,寫一個主函數,然後輸出一句話,但是當我們編譯出來ELF的時候,我們使用工具readelf,去查看下這裡面的FUNC,會發現多了很多方法。然後這裡已經沒有main函數了,直接用的_start,這個屬於覆蓋的方式,那麼我們自己定義一個名字,該怎麼處理呢?
  • C語言必須寫main函數?最簡單的Hello world 你其實一點都不懂!
    既然它們的流程是,系統加載進來,然後初始化,再到我們的main方法,那麼這個main方法,肯定是可以變的。為什麼這麼說呢?做過嵌入式開發的應該熟悉,基本上都沒有main函數一說,直接從跳轉入口開始跑就可以的。可以給任意函數,指定成Enter,也就是入口函數,使用連結腳本就可以指定,這塊感興趣的可以搜索gcc連結器參數。
  • 如何寫好 C main 函數 | Linux 中國
    但是不要這麼快就否定 C 語言 —— 它能夠提供很多東西,並且簡潔。如果你需要速度,用 C 語言編寫可能就是你的答案。如果你正在尋找穩定的職業或者想學習如何捕獲空指針解引用,C 語言也可能是你的答案!在本文中,我將解釋如何構造一個 C 文件並編寫一個 C main 函數來成功地處理命令行參數。我:一個頑固的 Unix 系統程式設計師。
  • 深度剖析C語言的main函數!
    return 語句如果 main 函數的最後沒有寫 return 語句的話,C99 和c++89都規定編譯器要自動在生成的目標文件中加入return 0,表示程序正常退出。不過,建議你最好在main函數的最後加上return語句,雖然沒有這個必要,但這是一個好的習慣。在linux下我們可以使用shell命令:echo $? 查看函數的返回值。
  • c語言main函數裡的參數argv和argc解析
    一般我們平時寫main函數的話,一般都是寫不帶參數的比較多,而且也習慣了這樣寫;其實標準的形式寫法,main函數是帶兩個參數的,這兩個參數分別是
  • C語言裡,main 函數中 return x和 exit(x) 到底有什麼區別?
    問題:C語言裡,main 函數中 return x和 exit(x) 到底有什麼區別 ?
  • Python 為什麼沒有 main 函數?為什麼我不推薦寫 main 函數?
    main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • main( )函數詳解
    C的設計原則是把函數作為程序的構成模塊。main()函數稱之為主函數,一個C程序總是從main()函數開始執行的。因為return語句通常寫在程序的最後,不管返回什麼值,只要到達這一步,說明程序已經運行完畢。而return的作用不僅在於返回一個值,還在於結束函數。現在我們來做一個小試驗(注意:本人的系統是Windows XP, 編譯環境是TC)來觀察main()函數的返回值。
  • C語言Main函數到底有幾種,你真的懂嗎?
    main函數,且一套程序裡面有且僅有一個。但是很多時候我們看到的main函數卻並不是千篇一律,格式竟然會有差別,這究竟是為啥?到底哪一種是對的呢?那麼我們這兒來聊一聊這些所謂的main函數。⚠ 簡潔明了,直接孤零零的mian()並沒有聲明返回值,也沒有傳入形式參數。講真如果真這麼寫,大部分編譯器會顯示警告,並且會返回值編譯器默認會認為是int類型。
  • 「C語言」int main還是void main?
    從一開始學習C語言剛開始寫代碼就遇到一個有爭議的問題(那就是主函數寫法),雖然剛開始就知道```int main```才是標準的寫法,但一直沒有深刻理解為什麼不能用
  • 為什麼我不推薦寫 main 函數?
    點擊上方「編程派」,選擇設為「設為星標」優質文章,第一時間送達!
  • C語言中的乘方函數是什麼?怎麼寫?
    乘方函數名稱:pow(double,double), 具體參數中至少一方為float、double、long double類型。如計算5;時, 直接使用 pow(5,3);返回結果即記為125。我們也可以自定義乘方函數如:float power( float x,int n ) //自定義乘方函數{ int i;float s=1.0; //初始化變量s,用於存儲最終結果值for( i=1;i<=n;i++ ) //利用循環進行計算
  • 深入淺出剖析C語言函數指針與回調函數(一)
    百度的權威解釋如下:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • C語言之函數
    一.函數的概念1.C語言中,最簡單的程序模塊就是函數。2.函數被視為程序設計的基本邏輯單位,一個c程序是由一個main()函數和若干其他函數組成。3.程序執行從main()函數開始,main()函數可以調用其他函數,其他函數可以互相調用。
  • 【C語言】02.第一個C語言程序
    不過呢,開發工具屏蔽了很多操作細節和語法細節,不利於初學者直觀、系統地學習一門語言。因此,在這裡,我們暫時使用文本編輯工具UltraEdit來寫C語言代碼。 2.寫代碼1> C程序由函數構成寫代碼之前,你首先要知道:任何一個C語言程序都是由一個或者多個程序段(小程序)構成的,每個程序段都有自己的功能,我們一般稱這些程序段為「函數」。