【C】 33_main 函數與命令行參數

main 函數的概念

  • C 語言中 main 函數稱之爲主函數
  • 一個 C 程序是從 main 函數開始執行的

下面的 main 函數定義正確嗎?linux

A.面試

main()
{
}

B.shell

void main()
{
}

c.編程

int main()
{
}

D.數組

int main()
{
    return 0;
}

A B C D 編譯無警告,無錯誤,運行正常bash

D 爲最標準函數

main() 函數的本質

  • main 函數是操做系統調用的函數
  • 操做系統老是將 main 函數做爲應用程序的開始
  • 操做系統將 main 函數的返回值做爲程序的退出狀態

思考:爲何 C 編譯器支持那麼多不一樣的 main 函數元原型呢?操作系統

C 語言誕生初期就獲得的普遍的應用,,當時的程序比較簡單,主要應用於科學運算或嵌入式設備中。在當時的環境下,只須要知道入口函數在哪裏即可以,在非操做系統中運行,返回值是無心義的。命令行

隨着商業編譯器的競爭與發展,編譯器開始支持更多的 C 語言特性,並對編譯器的功能進行擴展。指針

編程實驗: main 函數的返回值

A.C

#include <stdio.h>

int main()
{
    printf("I'm A!\n");

    return 0;
}

B.c

#include <stdio.h>

int main()
{
    printf("I'm B!\n");

    return 99;
}
命令行:【GCC】 
./a.out  && ./b.out

輸出:
I'm A!
I'm B!

命令行:【GCC】
./b.out && ./a.out

輸出:
I'm B!

在操做系統中的做用

操做系統中存在批處理語言。在 linux 中爲 shell 腳本,其聯合各類應用程序協做完成任務,經過應用程序返回值監控程序的運行狀態。

main 函數的參數

  • 程序執行時能夠向 main 函數傳遞參數

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

argc - 命令行參數個數
argv - 命令行參數數組 (命令行參數以字符串形式」存儲「於指針數組中)
env - 環境變量數組 (環境變量以字符串形式「存儲」於指針數組中)

  • gcc 編譯器的常見用法

./a.out a.c b.c c.c

argc      --->  4
argv[0]   --->  a.out
argv[1]   --->  a.c
argv[2]   --->  b.c
argv[3]   --->  c.c

實例分析: main 函數的參數

#include <stdio.h>

int main(int argc, char* argv[], char* env[])
{
    int i = 0;
    
    printf("=============Begin argv=============\n");
    
    for(i=0; i<argc; i++)
    {
        printf("%s\n", argv[i]);
    }
    
    printf("=============End argv=============\n");
    
    printf("\n");
    printf("\n");
    printf("\n");
    
    printf("=============Begin env=============\n");
    
    for(i=0; env[i]!=NULL; i++)
    {
        printf("%s\n", env[i]);
    }
    
    printf("=============End env=============\n");
}
命令行: ./a.out a.c b.c c.c
輸出:
=============Begin argv=============
./a.out
a.c
b.c
c.c
=============End argv=============



=============Begin env=============
ORBIT_SOCKETDIR=/tmp/orbit-delphi
SSH_AGENT_PID=1695
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=6c560f89cd4609726ff940b800000007-1544093738.93069-2082860285
WINDOWID=71303204

......
......

=============End env=============

實例,gcc 命令行不一樣參數,實現不一樣功能

小技巧

  • 面試中的小問題,main 函數必定是程序執行的第一個函數嗎?

不必定。
在 gcc 中使用屬性關鍵字 attribute, 能夠指定 main 以前與 main 以後分別執行一個函數。
但有的編譯器沒有支持相關功能關鍵字擴展,那麼 main 函數是第一個運行的函數,例BCC。

實例分析: gcc 中的屬性關鍵字

#include <stdio.h>

#ifndef __GNC__
#define __GNU__
#endif

__attribute__((constructor))
void before_main()
{
    printf("%s\n", __FUNCTION__);
}

__attribute__((destructor))
void after_main()
{
    printf("%s\n", __FUNCTION__);
}

int main()
{
    printf("%s\n", __FUNCTION__);
    
    return 0;
}
輸出:
before_main
main
after_main

小結

  • 一個 C 程序是從 main 函數開始執行的
  • main 函數是操做系統調用的函數
  • main 函數有參數和返回值
  • 現代編譯器支持在 main 函數前調用其它函數

補充:不一樣編譯器有不一樣的功能擴展,爲了程序的能夠執性,若是不是及其特殊狀況,不編寫依賴編譯器的代碼

以上內容參考狄泰軟件學院系列課程,請你們保護原創!

相關文章
相關標籤/搜索