- 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 函數的返回值做爲程序的退出狀態
思考:爲何 C 編譯器支持那麼多不一樣的 main 函數元原型呢?操作系統
C 語言誕生初期就獲得的普遍的應用,,當時的程序比較簡單,主要應用於科學運算或嵌入式設備中。在當時的環境下,只須要知道入口函數在哪裏即可以,在非操做系統中運行,返回值是無心義的。命令行
隨着商業編譯器的競爭與發展,編譯器開始支持更多的 C 語言特性,並對編譯器的功能進行擴展。指針
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 函數傳遞參數
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
#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。
#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 函數前調用其它函數
補充:不一樣編譯器有不一樣的功能擴展,爲了程序的能夠執性,若是不是及其特殊狀況,不編寫依賴編譯器的代碼
以上內容參考狄泰軟件學院系列課程,請你們保護原創!