1.main函數的概念
- C語言中main函數稱之爲主函數,一個C語言程序是從main函數開始執行。
- main函數定義的標準形式:
- 經實驗可知都正確
2. main函數的本質
- main函數是操作系統調用的函數;
- 操作系統總是將main函數作爲應用程序的開始
- 操作系統將main函數的返回值作爲程序的退出狀態
- 思考:爲什麼C編譯器支持那麼多不同的main函數原型?
- 操作系統是希望main函數的有返回值的,這樣可以知道main函數的退出狀態。如果程序時異常退出的,在有的系統上面,會得到提示:程序異常退出。C編譯器支持多種不同的main函數原型,因爲在早期有C語言,但是沒有複雜的操作系統,有些程序甚至直接跑在裸機上,這樣的程序的返回值也沒有什麼意義。所以,由於歷史的原因,使得C編譯器支持多種不同的main函數原型。
3.main函數的參數
- 程序執行時可以相main函數傳遞參數:
int main()
int main(int argc) // int argc:操作系統調用main函數時寫的命令行參數的個數
int main(int argc, char *argv[])//int argc:操作系統調用main函數時寫的命令行參數的個數;char *argv[]:每個命令行參數保存在這個指針數組中
int main(int argc, char *argv[], char *env[]) // int argc:操作系統調用main函數時寫的命令行參數的個數;char *argv[]:每個命令行參數保存在這個指針數組中; char *env[]: 環境變量
- gcc編譯器常見用法:
4.編程實驗
- 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");
return 0;
}
- argv中的個數是由argc指示的,但是env變量並沒有指示其中有多少條環境變量信息,我們只能通過判斷空指針來確定。
- 運行結果:
- 註釋掉環境變量的打印:
5. 問題: main函數一定是程序執行的第一個函數?
- 分析這個問題之前,先學習gcc中屬性關鍵字
#include <stdio.h>
#ifndef __GNUC__
#define __attribute__(x)
#endif
__attribute__((constructor))
void befor_main()
{
printf("%s\n", __FUNCTION__);
}
__attribute__((destructor))
void after_main()
{
printf("%s\n", __FUNCTION__);
}
int main()
{
printf("%s\n", __FUNCTION__);
return 0;
}
- 運行結果:
- 回答問題:main函數一定是程序執行的第一個函數嗎?
- 答案:不一定。在gcc編譯器中由attribute屬性關鍵字,調用這個屬性關鍵字可以在main函數之前執行函數,如上示例程序所示;但在bcc編譯期中沒有attribute屬性關鍵字,首先執行的是main函數。
6.小結
- —個C程序是從main函數開始執行的
- main函數是操作系統調用的函數
- main函數有參數和返回值
- 現代編譯器支待在main函數前調用其它函數