這是在面試中被問到的一個問題,回答了是。這問題第一感覺答案就是否定的,一時也沒想出來理由只能回答了是。當時太緊張了,其實回想一下匯編語言就該想到程序的入口地址是可以指定的,c語言編譯器默認以main作為入口地址。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、涼州網(wǎng)站維護、網(wǎng)站推廣。
網(wǎng)上查閱后,發(fā)現(xiàn)了 __attribute__ 這個關(guān)鍵字,它可以設(shè)置函數(shù)屬性,變量屬性,類型屬性。
1、前言
最近看到一份代碼,看到一個函數(shù)前面用__attribute__((destructor))修飾,當時感覺有點怪怪的,搜了整個程序,也沒發(fā)現(xiàn)哪個地方調(diào)用這個函數(shù)。于是從字面意思猜想,該函數(shù)會在程序結(jié)束后自動調(diào)用,與C++中的析構(gòu)函數(shù)類似。第一次接觸GNU下的attribute,總結(jié)一下。
2、__attribute__介紹
__attribute__可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。__attribute__前后都有兩個下劃線,并且后面會緊跟一對原括弧,括弧里面是相應的__attribute__參數(shù)
__attribute__語法格式為:__attribute__ ( ( attribute-list ) )
若函數(shù)被設(shè)定為constructor屬性,則該函數(shù)會在main()函數(shù)執(zhí)行之前被自動的執(zhí)行。類似的,若函數(shù)被設(shè)定為destructor屬性,則該函數(shù)會在main()函數(shù)執(zhí)行之后或者exit()被調(diào)用后被自動的執(zhí)行。例如下面的程序:
#include stdio.h #include stdlib.h static int * g_count = NULL; __attribute__((constructor)) void load_file() { ? ? printf("Constructor is called.\n"); ? ? g_count = (int *)malloc(sizeof(int)); ? ? if (g_count == NULL) ? ? { ? ? fprintf(stderr, "Failed to malloc memory.\n"); ? ? } } __attribute__((destructor)) void unload_file() { ? ? printf("destructor is called.\n"); ? ? if (g_count) ? ? free(g_count); } int main() { ? ? return 0; }
程序執(zhí)行結(jié)果如下:
看下面的例子:
// gcc 編譯器#includestdio.h__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;}
輸出結(jié)果為:before_main
main
after_main
可以看到上面的程序并不是從main函數(shù)開始執(zhí)行的。constructor 設(shè)置在main前面執(zhí)行,destructor 設(shè)置在main之后執(zhí)行。
進入程序后,就開始找main函數(shù),可能是int main也可能是void main等。
然后可能遇到判斷、循環(huán)、分支結(jié)構(gòu),然后按各自的語法分別執(zhí)行,還可能遇到被調(diào)函數(shù),到了那里就再去執(zhí)行被調(diào)函數(shù),執(zhí)行完被調(diào)函數(shù)就再回來。
直到main函數(shù)全部執(zhí)行完畢,直到最后一行結(jié)束,然后程序退出,運行界面出現(xiàn)perss any key to continue。
順序就是從上到下。遇到一些結(jié)構(gòu)遵循結(jié)構(gòu)的語法進行,但是整體順序就是由上到下。
C語言中main函數(shù)可以在任意位置。?
每一個C語言程序有且只有一個主函數(shù)(main()),且程序必須從main()函數(shù)開始,它是程序開始時調(diào)用的第一個函數(shù)。函數(shù)定義形式:【int main(void){}】。
C語言規(guī)定,在一個C程序中,main()函數(shù)可以在任意位置。
解析:
每個C程序有且只有一個主函數(shù)(main),且程序必須從main()函數(shù)開始執(zhí)行,而且main()函數(shù)可以放在程序中的任意位置。
詳細介紹:
在宿主環(huán)境中編譯的C程序必須定義一個名為main的函數(shù),這是程序開始時調(diào)用的第一個函數(shù)。
main()函數(shù)的定義有以下兩種形式:
(1)函數(shù)沒有參數(shù),返回值為int類型。int main( void ) { /*…*/ }.
(2)函數(shù)有兩個參數(shù),類型分別是int和char**,返回值是int類型。int main( int argc, char *argv ) { /*…*/ }.
這兩種定義方式都符合C語言標準。除此之外,許多C的實現(xiàn)版本還支持第三種、非標準語法的定義方式:int main( int argc, char *argv, char *envp ) { /*…*/ }.
函數(shù)返回值是int,有3個參數(shù):第一個是int,另外兩個是char**。
c程序的執(zhí)行總是從本程序的main函數(shù)開始執(zhí)行的。
一個C語言的執(zhí)行是從本程序的main函數(shù)開始,到main函數(shù)結(jié)束,但需要注意的是,也是有特殊情況的,若是代碼中出現(xiàn)了exit函數(shù),則直接結(jié)束程序。
c程序介紹
c程序C語言是世界上最流行、使用最廣泛的面向過程的高級程序設(shè)計語言。 C語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進行操作的場合,用C語言明顯優(yōu)于其它高級語言,許多大型應用軟件都是用C語言編寫的。
C語言具有繪圖能力強,可移植性,并具備很強的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動畫是它數(shù)值計算的高級語言。
不僅如此,C語言也是在計算機中比較實用的程序設(shè)計工具,掌握了c語言之后,對用戶在日后學習JAVA、C++、VB等都是有好處的,可以打下良好的基礎(chǔ),主要是因為這些語言大部分都是由C語言擴充或衍生而來的。
C語言是一門面向過程、抽象化的通用程序設(shè)計語言,廣泛應用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產(chǎn)生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設(shè)計語言。
main()函數(shù)稱之為主函數(shù),一個C程序總是從main()函數(shù)開始執(zhí)行的,但是不一定在main函數(shù)最后結(jié)束。
在 main() 之后的最后一條語句結(jié)束后,程序還要運行一些代碼,以正常返回操作系統(tǒng)。main函數(shù)執(zhí)行完后還執(zhí)行其他語句,
有時候需要有一種與程序退出方式無關(guān)的方法來進行程序退出時的必要處理,方法就是用atexit()函數(shù)來注冊程序正常終止時要被調(diào)用的函數(shù),atexit()函數(shù)的參數(shù)是一個函數(shù)指針,函數(shù)指針指向一個沒有參數(shù)也沒有返回值的函數(shù),它的原型是:
int atexit(void (*)(void));
擴展資料
main函數(shù)的使用
示例:
#include stdlib.h
#include stdio.h
void fn1(void);
void fn2(void);
int main(void)
{
atexit(fn1);
atexit(fn2);
printf("main exit ...\n");
return 0;
}
void fn1()
{
printf("calling fn1()...\n");
}
void fn2()
{
printf("calling fn2()...\n");
}
參考資料來源:百度百科—main函數(shù)
標題名稱:c語言main函數(shù)開始 c語言為什么從main函數(shù)開始
地址分享:http://chinadenli.net/article0/hgcioo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、自適應網(wǎng)站、網(wǎng)站制作、服務器托管、軟件開發(fā)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)