c語言深度剖析(33)—main函數與命令行參數

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函數前調用其它函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章