1. 程式人生 > 其它 >C的main函式解析

C的main函式解析

技術標籤:C/C++c語言c++

終於開始學習Linux的C語言程式設計了嚶嚶嚶,有種終於入門的感動

關於Linux中C語言程式設計包括vim、gcc、makefile這些工具的用法這些不是本次的主題,我在這裡就不詳細展開了,本文只闡述一下main函式的引數呼叫問題。

工具

VirtualBox 6.1.12,Ubuntu 20.04,Code::Blocks,C

基本原理

眾所周知,main函式對於系統來說其實也只是一個普通的函式,它作為一個介面與系統進行連線,每次系統呼叫main函式生成的程式檔案。而Linux系統其實又是通過C語言寫出來的,本質上其實也只是一個C程式。而呼叫C生成的程式檔案其實就等同於將Linux的一個程式執行指標呼叫這個程式的地址,然後這個程式就執行起來了,而我們可以通過main函式的兩個引數介面在呼叫這個程式的時候進行傳參。

實現與解析

// Hello.c,用於測試main引數傳遞
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("程式地址為:%s\n", argv[0]);
    printf("本次傳入引數共有%d個\n", argc - 1);
    int i = 1;
    while(i < argc)	// 通過迴圈遍歷傳入所有引數
    {
        switch(argv[i][0])	// 通過首字母進行快速定位
{ case 'w': case 'W': { if(strcmp(argv[i], "World") == 0) { printf("Hello World!\n"); break; } else printf
("Is W/w but not World~\tHello %s\n", argv[i]); // 是W/w但是並非World break; } case 'l': case 'L': { if(strcmp(argv[i], "Linux") == 0) { printf("Hello Linux!\n"); break; } else printf("Is W/w but not World~\tHello %s\n", argv[i]); // 是L/l但是並非Liunx break; } default: printf("This is %s\n", argv[i]); break; } i++ } return 0; }

這裡我們可以看到main函式中有兩個引數,分別是int型別的argc和char**型別的argv兩個引數,當然這兩個引數的名字可以變換,就像普通函式的形參一樣,但是通常大家都用這兩個,相當於約定俗成了。可以看出argv是一個指向char陣列的指標陣列的陣列指標,聽上去有點繞,但是用char * argv[]應該就比較好理解了,或者說甚至可以直接當成一個二維陣列,其中第一維是一堆地址,每個地址分別指向一個char陣列的首地址,而char陣列則構成了第二維。而argc則記錄了其中第一維的指標argv[]的個數。

不過值得注意的是,argv有一個預設值argv[0]為程式自身所處地址,比如說如果我們在Windows下檢測一個在D:\Code下的test.exe函式,其argv[0]的值就為:D:\Code\test.exe。

我用如下程式進行了測試:

#include <stdio.h>

int main(int argc, char * argv[])
{
    printf("當前檔案的路徑:%s\n", argv[0]);
    return 0;
}

輸出結果如下:

在這裡插入圖片描述

而我們剛才說過argc記錄的argv[]的個數,所以同理,我們知道argc的預設值為1。

所以我們其實就可以把*argv[] 當成一堆指令,每個指令argv[i]在傳入到程式中後就是一個char陣列的形式。用歸類拓展的方式去理解,其實我們平時在cmd中使用的help xx也許其實也相當於是一個程式,help是函式名而xx則是一個引數(當然事實上是不是這樣我也不知道,只是做一個例子便於理解,不過想來相差不大)。

而有了這些認識,我們再看一下上面的程式,就不難理解我的操作了:

在輸出了地址和本次傳入引數個數後,程式將會從我傳入的第一個引數(也就是argv[1])開始,一直到最後一個引數,分別將其作為指令進行判斷,如果為Linux或World則輸出Hello World,其他指令則以This is xx進行輸出,而如果判斷出首字母為L/l或W/w的指令則會多輸出一句Is W/w but not World~\t,最終執行結果如下:

在這裡插入圖片描述