那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

main函數的末尾沒有return語句會有什么影響

Wildesbeast ? 來源:今日頭條 ? 作者:linux內核 ? 2020-02-20 15:32 ? 次閱讀

c語言中,如果main函數的末尾沒有return語句將會有什么影響?":

問題的本質

回答這個問題其實只要理解一個東西就行了:

那就是帶有返回值的函數請務必提供返回值,這個是基本約定也是編程習慣,如果大家都遵守,你不遵守,各種奇葩和頭疼的后果就遲早會來,不管是 main 也好,其他函數也好。

所以,準大一這個時候一定要從現在開始養成習慣,遵守語言的基本約定。

main 的標準聲明

main 的標準聲明是什么?

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

很多同學寫例子,也有這么寫的?

void main(void) { }

實際上,完整的 main 聲明還有第三個參數 env,這里不做展開。

C 語言各標準差異以及靜態檢測方法

這種可以用 -Wall 檢查出來:

$ echo 'void main(void) {}' | gcc -Wall -x c - - :1:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]

如果用 int 默認檢查不出來 return value ,默認是兼容 c11 的 gnu11:

$ echo 'int main(void) {}' | gcc -Wall -x c - - $ echo 'int main(void) {}' | gcc -Wall -std=gnu11 -x c - -

試了下,c99 之后都是沒有提示問題。但是 c90 以及之前都提示需要加返回值:

$ echo 'int main(void) {}' | gcc -Wall -std=c90 -x c - - : In function ‘main’: :1:1: warning: control reaches end of non-void function [-Wreturn-type]

考慮到兼容性,建議務必養成寫法上的習慣。由于 main 稍微特殊些,c99 默認處理了,但是對于其他函數還是要自己加,不做處理的話,是有很大風險的。

對于 c99 以及之后的版本,對普通函數還是會做檢查。如果有的寫,有的不寫,不一致的話久而久之習慣就很難養成了。

$ echo 'int test(void) {}; int main(void) { test(); }' | gcc -Wall -std=c99 -x c - - : In function ‘test’: :1:1: warning: control reaches end of non-void function [-Wreturn-type]

由于人總會出錯,所以,在編譯的 cflags 里頭,建議強制加上 -Wall -Werror,在遇到這類錯誤是強制退出,而不僅僅是警告。當然,對于已經存在的項目,prove-in-use 的情況下,建議保留之前的默認配置選項,除非要確實投入很多精力去重構。

$ echo 'int main(void) {}' | gcc -Wall -Werror -std=c90 -x c - - : In function ‘main’: :1:1: error: control reaches end of non-void function [-Werror=return-type] cc1: all warnings being treated as errors

關于返回值的含義

需要注意的是,默認情況下,沒有錯誤,就是 return 0,而不是 return 1。

完整的模板:

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

上面多次提到了后果和風險,為什么?因為檢查函數和程序返回值是一個最最基礎的操作。如果不按常理返回正確的返回值,后果是,后續對該值的檢查所做出的所有動作都可能不可預知。

這個值是怎么體現的呢?

$ echo -e 'int main(void){ return 0; }' | gcc -Wall -Werror -std=c99 -O0 -x c - - $ ./a.out $ echo $? 0 $ echo -e 'int main(void){ return 100; }' | gcc -Wall -Werror -std=c99 -O0 -x c - - $ ./a.out $ echo $? 100

比如說,在 Shell 編程中通常會在程序執行完,立即檢查返回值,然后決定接下去做什么操作?

if [ $? -eq 0 ]; then echo 'Success'; else echo 'Failure'; fi

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137704
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968
收藏 人收藏

    評論

    相關推薦

    MQX操作系統啟動到main函數的過程

      當一個嵌入式操作系統上電的時候,是如何從硬件跳轉到軟件的main函數里面的呢?許多學習嵌入式軟件的人一開始都會有這樣的疑惑,今天這里將詳細介紹MQX系統啟動到main
    發表于 11-08 15:48 ?1064次閱讀
    MQX操作系統啟動到<b class='flag-5'>main</b><b class='flag-5'>函數</b>的過程

    void main()還是int main()?

    操作系統)。 如果 main 函數的最后沒有return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入
    發表于 12-17 20:21

    main函數返回值的認知

    *argv[] ) 。main 函數的返回值類型必須是 int ,這樣返回值才能傳遞給操作系統。 如果 main 函數的最后沒有
    發表于 10-24 11:08

    C語言,函數return的作用

    在一個函數中,不管return處于什么位置,只要執行了return 就跳出函數,是這樣嗎?比如在for,wile或if循環語句中,即使不滿足
    發表于 05-09 09:48

    為什么OSStart()函數之后的函數不能被執行但后面會加別的語句

    在原子的代碼OSStart()之后添加測試代碼,測試發現沒有執行,但是看有些人會在OSStart()之后寫上while(1);或是return(0);的語句,不知道何解?
    發表于 09-05 04:35

    淺談C語言return語句的用法

    函數沒有類型(類型為void),那么它就沒有返回值,也就是說子函數沒有return
    發表于 05-11 09:45

    淺談C語言return語句main 函數的返回值

    函數中,如果碰到return 語句,那么程序就會返回調用該函數的下一條語句執行,也就是說跳出函數
    發表于 05-10 10:53 ?5362次閱讀

    科普:Python函數默認返回 None 的原因

    Python 有一項默認的做法,很多編程語言都沒有——它的所有函數會有一個返回值,不管你有沒有return
    的頭像 發表于 08-17 11:39 ?2420次閱讀

    C語言的main函數有幾種寫法?

    從學習C語言開始就一直寫個一個函數,那么你知道它的標準寫法什么什么樣嗎? main函數,又稱主函數,是程序執行的起點,我們平時寫的main
    的頭像 發表于 10-15 11:04 ?3364次閱讀

    深度剖析C語言的main函數

    main的返回值 main函數的返回值用于說明程序的退出狀態。如果返回0,則代表程序正常退出。返回其它數字的含義則由系統決定。通常,返回非零代表程序異常退出。 void main()
    的頭像 發表于 12-18 17:07 ?4444次閱讀

    return-函數的返回值是什么

    return關鍵字后接變量名或表達式可以將函數的計算結果返回到調用處。變量或表達式等同于接收果汁、豆漿的杯子。如果函數沒有返回值,return
    的頭像 發表于 02-23 10:52 ?1274次閱讀
    <b class='flag-5'>return</b>-<b class='flag-5'>函數</b>的返回值是什么

    C語言編程中main函數退出后程序去哪兒了?

    PIC 單片機語言程序進行跟蹤,發現main() 函數最后一條語句為 reset,也就是單片機直接復位,這是 MAPLAB編譯器根據 PIC 單片機特點增加的復位語句
    發表于 05-31 15:28 ?447次閱讀
    C語言編程中<b class='flag-5'>main</b><b class='flag-5'>函數</b>退出后程序去哪兒了?

    為什么Python沒有main函數

    今天的文章中,我們來討論一下為什么有的編程語言有main函數,而Python為什么沒有main函數
    發表于 08-17 11:47 ?346次閱讀

    python函數返回多個參數

    。 在Python中,可以使用關鍵字 return 來返回一個或多個值。在函數定義的末尾,可以使用 return 語句來指定
    的頭像 發表于 11-21 16:37 ?1362次閱讀

    if嵌套函數的正確輸入方法為

    = nested_function() # 使用嵌套函數的結果進行后續操作 else : # else語句的邏輯 return result 在上面的示例中,我們首先定義了一個名為 main
    的頭像 發表于 11-30 16:50 ?1476次閱讀
    澳门百家乐战法| 幸运水果机小游戏| 百家乐网上赌博网| 百家乐如何投注| 百家乐官网娱乐网代理佣金| 百家乐官网六手变化混合赢家打法 | 嘉年华百家乐的玩法技巧和规则| 百家乐教父方法| 钱柜百家乐官网的玩法技巧和规则 | 百家乐官网赌场分析网| 百家乐官网美食坊| 延庆县| 遂溪县| 金贊娱乐城| 星期八娱乐| 盛世国际,| bet365手机版| 大发8888娱乐场下载| 大发888博狗博彩| 大发888娱乐场存款| 百家乐平注常赢玩法更| 百利宫百家乐的玩法技巧和规则 | 康莱德百家乐的玩法技巧和规则 | 三元风水24山水法| 游戏百家乐押发| 百家乐园胎教网| 刀把状的房子做生意| 罗盘24山作用| 精英百家乐现金网| 百家乐澳门百家乐| 百家乐最稳妥的打法| 百家乐太阳城娱乐城| 玩百家乐新澳门娱乐城| 凯旋门百家乐现金网| 赌场百家乐攻略| 百家乐注码投注论坛| 百家乐扑克桌| 百家乐永利娱乐平台| 龍城百家乐的玩法技巧和规则| 玩百家乐怎么能赢呢| 富田太阳城租房|