標籤:c++ c語言 語言 編程
經過上節課,大家現在已經有了一個可啟動並執行C語言程式、相關代碼和開發環境。
也許你會有一點疑問,為什麼是建立main.cpp而不是main.c
另外,printf是什嗎?main是什嗎?#include是什嗎?
嗯,不要急,這些問題我都會慢慢告訴你們。
通過上節課的內容,我們知道代碼要想編程程式,是需要一個工具的。
在windows下面,該工具vs提供了;而在linux下面,該工具叫做gcc。
這個工具,就是我們後面會提到的,稱為編譯器的東西。因為它將原始碼編碼轉譯為可運行檔案,所以叫做編譯器。
為了說明後面的內容,我們先建立一個標頭檔:
按右鍵項目,選擇添加→建立項
選擇中的標頭檔,檔案名稱輸入public.h
然後新加一行代碼,如下面所示(基於上課的代碼):
#include<stdio.h>
#include“public.h”
intmain(intargc,char**argv,char**env)
{
printf("hello world!\n");
return0;
}
下面我們再來看看代碼。任何一個C或者C++的原始碼,基本都會有兩個部分:標頭檔引用說明和函數實現
這裡#include<stdio.h>就是標頭檔引用說明部分。它告訴編譯器,我這裡會用到一些其他檔案裡面聲明的函數。
#include 有兩種方式,一種是上文提到,另外一種是用雙引號如下面的代碼一樣
#include“public.h”
兩者的區別是,前者告訴編譯器,我引用的檔案是庫檔案的標頭檔(庫檔案的詳細概念後面會講,這裡各位可以簡單的理解為作業系統提供的基本函數,用來簡化軟體開發。),請從系統標頭檔開始找起;後者告訴編譯器,這個標頭檔是我自己定義的,請先從目前的目錄找起。
這樣編譯器就會根據你的指示,去尋找這些標頭檔。
intmain(intargc,char**argv,char**env)
這行代碼,告訴編譯器,我這裡有一個函數叫做main
它有三個參數argc argv和env,它的返回值是整數
這裡特彆強調的一點是main函數,在一個程式中只能被實現一次!
因為這個函數有一個特別的函數,它是所有代碼的起點,程式的入口函數。
也就是程式啟動並執行時候,會首先運行該函數,而不是其他的函數。
所以這個函數也只能實現一次,否則有多個實現,就相當於是有多個入口,你讓程式從哪個進入呢?
畢竟從一個進,其他入口怎麼辦?所以乾脆定義一個規則,一個程式只能定義一個入口。這樣大家都好辦了。
也許你手上有一本教材,或者別的什麼資料,它的main函數是這樣給的:
int main(intargc)
int main(intargc,char* argv[])
int main(intargc,char*argv[],char*env[])
甚至乾脆是這樣的
int main()
以及這樣的
void main()
嗯,不要激動,他們都是對的,我也是對的
就像我上面說過的,這個函數只是告訴編譯器,我的入口在這裡
至於這個入口是個什麼樣的入口,編譯並不太關心。
但是注意!!雖然你甚至可以這樣定義main函數:int main(void*param)
可是系統在調用你的這個入口的時候,它會按照啟動時參數的個數(argc)啟動時參數的列表(argv)啟動時環境變數列表(env)的順序傳遞參數。從可以看到param在啟動並執行時候,系統傳遞進來的值是1。表明啟動時只使用了一個參數。其他的參數你可以不要,但是你不能更改系統給你的參數。
所以我們定義main函數最好按照大家的約定來
而且更有意思的是,儘管你可能不想要這三個參數,可是系統仍然會給出,完全無視你的需求
比如我如下定義main函數
從實際調試情況來看,系統仍然將argv(也就是啟動參數列表)和env(運行環境列表)傳遞給了我。只是我需要用一些特殊的手法才能看到這種情況。
所以,大家定義main函數的時候最好採用我給的方法:
intmain(intargc,char**argv,char**env)
既然你無法捨棄,為了程式的可控性,最好還是都拿著——畢竟不管你拿還是不拿,它都在哪裡,相對於不可控的情況,拿在手裡心裡更加踏實。
好了,總結一下:
本節主要學習了以下幾點:
1 原始碼的構成有兩個部分:標頭檔和函數實現
2 如何建立一個自訂的標頭檔
3 入口main函數的知識。
那麼現在你現在算是基本有了C語言(或者說是C++語言)入門的第一步。
注意第一點!以後不論你接觸到的代碼有多麼複雜或者多麼簡單,都離不開這個框(否則要麼是一個無用的程式,要麼是一個錯誤的程式)。
關於main函數裡面其他內容,在下章和後續章節我還會深入下去,所以千萬別忘記了。
zerglurker的C語言教程002