c語言中,如果main函數(shù)的末尾沒有return語句將會有什么影響?":
問題的本質(zhì)
回答這個問題其實只要理解一個東西就行了:
那就是帶有返回值的函數(shù)請務(wù)必提供返回值,這個是基本約定也是編程習(xí)慣,如果大家都遵守,你不遵守,各種奇葩和頭疼的后果就遲早會來,不管是 main 也好,其他函數(shù)也好。
所以,準(zhǔn)大一這個時候一定要從現(xiàn)在開始養(yǎng)成習(xí)慣,遵守語言的基本約定。
main 的標(biāo)準(zhǔn)聲明
main 的標(biāo)準(zhǔn)聲明是什么?
int main(int argc, char *argv[])
很多同學(xué)寫例子,也有這么寫的?
void main(void) { }
實際上,完整的 main 聲明還有第三個參數(shù) env,這里不做展開。
C 語言各標(biāo)準(zhǔn)差異以及靜態(tài)檢測方法
這種可以用 -Wall 檢查出來:
$ echo 'void main(void) {}' | gcc -Wall -x c - -
如果用 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 - -
考慮到兼容性,建議務(wù)必養(yǎng)成寫法上的習(xí)慣。由于 main 稍微特殊些,c99 默認處理了,但是對于其他函數(shù)還是要自己加,不做處理的話,是有很大風(fēng)險的。
對于 c99 以及之后的版本,對普通函數(shù)還是會做檢查。如果有的寫,有的不寫,不一致的話久而久之習(xí)慣就很難養(yǎng)成了。
$ echo 'int test(void) {}; int main(void) { test(); }' | gcc -Wall -std=c99 -x c - -
由于人總會出錯,所以,在編譯的 cflags 里頭,建議強制加上 -Wall -Werror,在遇到這類錯誤是強制退出,而不僅僅是警告。當(dāng)然,對于已經(jīng)存在的項目,prove-in-use 的情況下,建議保留之前的默認配置選項,除非要確實投入很多精力去重構(gòu)。
$ echo 'int main(void) {}' | gcc -Wall -Werror -std=c90 -x c - -
關(guān)于返回值的含義
需要注意的是,默認情況下,沒有錯誤,就是 return 0,而不是 return 1。
完整的模板:
int main(int argc, char *argv[]) { return 0; }
上面多次提到了后果和風(fēng)險,為什么?因為檢查函數(shù)和程序返回值是一個最最基礎(chǔ)的操作。如果不按常理返回正確的返回值,后果是,后續(xù)對該值的檢查所做出的所有動作都可能不可預(yù)知。
這個值是怎么體現(xiàn)的呢?
$ 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 編程中通常會在程序執(zhí)行完,立即檢查返回值,然后決定接下去做什么操作?
if [ $? -eq 0 ]; then echo 'Success'; else echo 'Failure'; fi
-
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
145111 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4413瀏覽量
67196
發(fā)布評論請先 登錄
MQX操作系統(tǒng)啟動到main函數(shù)的過程
void main()還是int main()?
main函數(shù)返回值的認知
為什么OSStart()函數(shù)之后的函數(shù)不能被執(zhí)行但后面會加別的語句?
淺談C語言return語句和main 函數(shù)的返回值
如何解決STM32調(diào)試無法進入main函數(shù)的問題?
科普:Python函數(shù)默認返回 None 的原因
C語言的main函數(shù)有幾種寫法?
深度剖析C語言的main函數(shù)
return-函數(shù)的返回值是什么
C語言編程中main函數(shù)退出后程序去哪兒了?
main函數(shù)的末尾沒有return語句會有什么影響
評論