1、main函數的概念
C語言中main函數稱之為主函數
—個C程序是從main函數開始執行的
下面的main函數定義正確嗎?
//1
main(){
}
//2
void main(){
}
//3
int main(){
}
//4
int main(){
return 0;
}
2、main函數的本質
main函數是操作系統調用的函數
操作系統總是將main函數作為應用程序的開始
操作系統將main函數的返回值作為程序的退出狀態
思考:
為什么C編譯器支持那么多不同的main函數原型?
和C語言的發展有關
3、main函數的參數
程序執行時可以向main函數傳遞參數
int main() int main(int argc) // argc-命令行參數個數 int main(int argc, char * argv[] ) //argv-命令行參數數組 int main(int argc, char * argv[], char *env[]) //env-環境變量數組
gcc編譯器的常見用法:
gcc a.c b.c c.c
argc -----------------> 4
argv[0]--------------->gcc
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");
return 0;
}
4、小技巧
面試中的小問題
main函數一定是程序執行的第一個函數嗎?
#include <stdio.h>
#ifndef __GNUC__
#define __attribute__(x) //如果不是gcc編譯器,定義空宏,如果是gcc編譯器直接刪除
#endif
__attribute__((constructor))
void before_main()
{
printf("%s\n",__FUNCTION__); //gcc拓展宏代表函數名
}
__attribute__((destructor))
void after_main()
{
printf("%s\n",__FUNCTION__);
}
int main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
BCC55會報錯,不認識宏_FUNCTION_,但現代編譯器很多已支持
所以若配合gcc屬性關鍵字,main函數可以不是程序執行的第一個函數
9、小結
—個C程序是從main函數開始執行的
main函數是操作系統調用的函數
main函數有參數和返回值
現代編譯器支待在main函數前調用其它函數
