記錄C C 的幾個標準以及main 函式的使用

2021-08-04 15:52:51 字數 1971 閱讀 7195

估計是跟著譚浩強學的c語言導致的,現在gcc編譯各種不通過讓我很鬱悶,不得已又得拿起書來重新學一遍,真正發現c語言沒有那麼簡單。當初學的時候被坑了而已。

for(int i = 0;i

$ gcc array.c array.c: in function 『print_array』: array.c:9:5: error:

『for』 loop initial declarations are only allowed in c99 mode

for(int i = 0;i < size;i++)

^ array.c:9:5: note: use option -std=c99 or -std=gnu99 to compile your code

原因很簡單,ansi c標準是根本就不支援這種寫法的,標準c語言的寫法是

int i;

for(i = 0;i

想要不更改編譯上面那句程式,根據提示在後面加上 -std=c99即可。

還有乙個問題,main()函式的問題。

標準c的main()函式寫法:

main()

這是c之父在所作的《c程式語言 第2版》的書上第乙個程式。這是因為第一版的c語言只有int型別,直接可以省略不寫。ansi c標準中這完全是正確的,缺省會return 0。

但是在後來的c99標準中,不允許這麼寫了,起碼會報乙個未定義返回值型別的警告。

c99標準中定義的main()函式寫法只有兩個:

int main( void ) 

int main( int argc, char *argv )

第一種不需要從命令列中獲取引數,否則,要使用第二種寫法。

引數argc記錄了命令列中命令與引數的個數,而指標陣列*argv的大小由引數argc的值決定,陣列的各指標分別指向乙個字串。應當引起注意的是接收到的指標陣列的各指標是從命令列的開始接收的,首先接收到的是命令,其後才是引數。

c++98 中定義了如下兩種 main 函式的定義方式:

int main( ) 

int main( int argc, char *argv )

第乙個標準就相當於c99中的int main(void),在gcc編譯器下,不加return 0也是可以通過的。但是為了更好的移植性,和適應新標準,我們的程式應該寫成如下:

#include 

int main()

至於void main()這種寫法,既不是c也不是c++定義的標準,根本就是錯誤的,main()函式的要求返回值必須是int型別。只是在某些編譯器上,編譯可以通過,例如vc6。

那麼為什麼一定要return 0呢?

答案是return 0是表示程式正常編譯退出所返回的值,如果我們返回別的值,程式會認為異常退出。

舉例子:a和b兩個程式,a&&b表示執行完a正常執行完之後執行b,但是如果a的返回值不是0,那麼我們就只能看到a被執行,b不會被執行。

總所周知,main()函式是主函式,程式執行的起點,當然main是相對來說的。其實main()函式未必是真正的入口點。

我引用c的一位大神告訴我的話:

預設情況下真正的程式入口點是執行時庫的乙個函式 它會執行執行時庫的初始化 處理命令列 編譯器會根據你的main形式決定如何呼叫你的main,所以多個形式的main只是執行時庫聯合編譯器提供的支援。

c的幾個標準有:

我們今天用的c語言標準,基本大多都是ansi c,也就是c89,這就是為什麼不滿足這個標準的寫法容易出問題的原因。

寫c還是盡量按照ansi c的標準來寫,在gcc編譯,寫c++再按照著c++的標準來寫,這樣也不至於混亂了。

關於c c 標準庫的記錄

1 itoa 原型 extern char itoa int i 用法 include 功能 把整數i轉換成字串 說明 返回指向轉換後的字串的指標 2 atoi 定義於標頭檔案 int atoi const char str long atol const char str long long at...

C C 帶引數的main函式

通過win32控制台的main函式的引數,我們可以像使用命令一樣對檔案等資料進行處理 main函式可以不帶引數,也可以帶引數,這個引數可以認為是 main函式的形式引數。c語言規定main函式的引數只能有兩個,習慣上這兩個引數寫為argc和argv。因此,main函式的函式頭可寫為 main arg...

C C 學習記錄 標準庫標頭檔案stdlib h

小結 1.字串轉換,常見於主函式傳參,如 atoi 2.隨機函式,如 srand,rand 3.記憶體操作,如 malloc,free,但是注意!memset,memcpy等操作是在標頭檔案string.h中 4.環境介面,如 exit 5.abs 以下是詳細 1 字串轉換 double atof ...