首先,需要明確main函數是什么?
答:main函數是C語言約定的入口函數
C99標准里面是這樣描述的:
Program startup
The function called at program startup is named main.The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) { /*...*/ }
or with two parameters (referred to here as argc and argv,though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /*...*/ }
同時,規定了main函數的兩種常見形式:
int main(void) 和 int main(int argc, char *argv[])
對於第一種形式大家經常用到,而第二種情況中的參數用法,可能關注的不太多,下面我們會進一步提及。
關於將main函數約定為入口函數(即:執行入口)的提法,MSDN上也有提到:
A special function named main is the starting point of execution for all C and C++ programs. If you are writing code that adheres to the Unicode programming model, you can use wmain, which is the wide-character version of main.
地址:https://msdn.microsoft.com/en-us/library/6wd819wh.aspx
從上面的討論,可以知道main函數是約定入口函數,那么標題“為什么需要main函數”,可以引申為“為什么需要入口函數”。
這個問題其實不好回答,想詳盡的了解,可以參考《程序員的自我修養》。
知乎上有一篇文章《C語言為什么要有 main 函數?具體作用是什么?》,大家可以參考。
地址:
http://www.zhihu.com/question/28360770
我們這里只是淺顯的回答,其中知乎上有一個簡單的回答,雖然不是太深入,但是相對比較直觀。
作者:Ivony,,,,
地址:http://www.zhihu.com/question/38055198/answer/74753788
這是個好問題,但是這個問題恐怕比你想的水深得多。
C++程序以main函數為入口這個說法嚴格來說並不正確。
我這里不展開,只簡單的談談。
要解決這個問題,我們先要看所謂的入口是什么意思,到底有什么用處。
一個程序需要怎么運行呢?在Windows上就是編譯成一個exe文件,然后雙擊,Windows就會幫你運行這個文件。Windows怎么知道怎么去運行這個文件?這么一大堆代碼應該從哪里開始執行?就需要這個文件提供一個所謂的入口,操作系統(或者說啟動器)從這個入口開始執行程序。
在這個例子里面,Windows就是這個程序的宿主/啟動器,這個宿主/啟動器要求程序需要一個入口也就是main函數。
在這里,大家可以回想現實生活中的現象,比如景點為何要設置“景區入口”?
請思考
只有規定了“景區入口”,游客才知道從哪進入;
只有規定了“景區入口”,景區才方便統一收費,統一安檢, 統一各種管理等等
說到這里,其實我想說一下討論該問題的初衷:
為了說明一個知識點,即我們可以在main函數,利用入口參數做一些工作,以達到控制程序行為的目的。
在int main(int argc, char *argv[]) { /*...*/ }函數 體中,argc為整型,標識參數個數;argv是指針數組,為參數列表,通常是利用argv中的參數做文章,我們看一個具體的小例子:
#include "stdio.h"
#include <string.h>
bool g_WriteLog = false;
int main( int argc, char *argv[] )
{
for(int i=0; i< argc; i++)
{
if( strcmp(argv[i], "-writelog") == 0 )
{
g_WriteLog = true;
}
}
if( g_WriteLog ) //開關默認關閉
{
for(int j=0; j < 10; j++ )
{
printf("%d\t" , j);
}
}
printf("\n");
return 0;
}
編譯:g++ control.c -o con
運行:./con –writelog
0 1 2 3 4 5 6 7 8 9
上述代碼中,利用入口參數“-writelog”控制是否打印數字。
舉個實際例子,可以通過參數,控制一組服務器的人數上限,比如你可以限制A服務器最多1000人,而限制B服務器最多2000人。
諸如此類的應用十分廣泛,有時候,也會在快捷方式中包含啟動參數,如下圖:
點擊快捷方式執行,也就相當於給main函數傳入了參數。
再多說一句,main函數還可以有第三個參數:
int main(int argc, char *argv[], char *envp[]);
感興趣的人,可以自己搜索一下相關資料。
總之,希望上述的討論,能引起大家一點思考,即便簡單的main函數也是很有料的;同時,希望大家記住main函數參數的用法。
最后,問題的理解,需要在實踐中加深;后續也請將你的理解分享給大家。