c語言程序總是從main函數開始執行
① 2、c語言程序總是從文件中的第一個函數開始執行。(
不是的,都是從main主函數開始執行的,其他的函數都是需要主函數調用的
② C程序必須從main()函數開始執行
這是在面試中被問到的一個問題,回答了是。這問題第一感覺答案就是否定的,一時也沒想出來理由只能回答了是。當時太緊張了,其實回想一下匯編語言就該想到程序的入口地址是可以指定的,c語言編譯器默認以main作為入口地址。
網上查閱後,發現了 __attribute__ 這個關鍵字,它可以設置函數屬性,變數屬性,類型屬性。
1、前言
最近看到一份代碼,看到一個函數前面用__attribute__((destructor))修飾,當時感覺有點怪怪的,搜了整個程序,也沒發現哪個地方調用這個函數。於是從字面意思猜想,該函數會在程序結束後自動調用,與C++中的析構函數類似。第一次接觸GNU下的attribute,總結一下。
2、__attribute__介紹
__attribute__可以設置函數屬性(Function Attribute)、變數屬性(Variable Attribute)和類型屬性(Type Attribute)。__attribute__前後都有兩個下劃線,並且後面會緊跟一對原括弧,括弧裡面是相應的__attribute__參數
__attribute__語法格式為:__attribute__ ( ( attribute-list ) )
若函數被設定為constructor屬性,則該函數會在main()函數執行之前被自動的執行。類似的,若函數被設定為destructor屬性,則該函數會在main()函數執行之後或者exit()被調用後被自動的執行。例如下面的程序:
看下面的例子:
// gcc 編譯器#include<stdio.h>__attribute__((constructor)) void before_main(){ printf("%s ",__FUNCTION__);}__attribute__((destructor)) void after_main(){ printf("%s ",__FUNCTION__);}int main(){ printf("%s ",__FUNCTION__); return 0;}
輸出結果為:before_main
main
after_main
可以看到上面的程序並不是從main函數開始執行的。constructor 設置在main前面執行,destructor 設置在main之後執行。
③ C語言中總是從main函數開始執行,那執行好main函數後,是按照從上到下的順序執行嗎
進入程序後,就開始找main函數,可能是int main也可能是void main等。
然後可能遇到判斷、循環、分支結構,然後按各自的語法分別執行,還可能遇到被調函數,到了那裡就再去執行被調函數,執行完被調函數就再回來。
直到main函數全部執行完畢,直到最後一行結束,然後程序退出,運行界面出現perss any key to continue。
順序就是從上到下。遇到一些結構遵循結構的語法進行,但是整體順序就是由上到下。
④ 讀「為什麼c程序要從main函數開始執行」
不一定從main開始執行
main是編譯器給的一個起始函數的名稱而已。
比如
intWINAPIWinMain()
同樣可以作為程序的起始函數
⑤ 2 一個C語言程序總是從()開始執行。
一個C語言程序總是從main()主函數開始執行。main是相對來說的,如同音學理論之主調於泛音,泛音即程序中的除main之外的其他函數,迎合人們的思考方式而生成的而非必定的模式。有主有次,執行起來條清縷析,既可將程序模塊化又實現了一個閉合的整體。
main 函數在程序啟動中完成對具有靜態存儲期的非局部對象的初始化之後被調用的。它是程序在有宿主 (hosted)環境(亦即有操作系統)中所指定的入口點。自立程序(啟動載入器,操作系統內核,等等)的入口點則由實現定義的。
主函數的兩個形參形式中的形參,允許從執行環境中傳遞任意的多位元組字元串(它們通常被稱為命令行參數),各個指針 argv[1] .. argv[argc-1] 指向每個這些字元串的第一個字元。argv[0] 是指向一個表示用於執行該程序自身的名字的空結尾多位元組字元串(或者當執行環境不支持時,為空字元串 "")的開頭字元的指針。
這些字元串是可以改動的,雖然對它們的改動並不會被傳回給執行環境:比如可以用 std::strtok 來使用它們。由 argv 所指向的數組的大小至少為 argc+1,其最後一個元素 argv[argc] 保證為一個空指針。
(5)c語言程序總是從main函數開始執行擴展閱讀
main 函數的返回值類型必須是 int ,這樣返回值才能傳遞給程序的激活者(如操作系統)。
如果 main 函數的最後沒有寫 return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不過,建議在main函數的最後加上return 語句,雖然沒有這個必要,但這是一個好的習慣。
也就是說在最新的C語言標准中強制要求main函數的返回值類型為int,main函數的返回值是傳遞給操作系統,讓操作系統判斷程序的執行情況(是正常結束還是出現異常)。
⑥ c語言程序總是從main函數開始執行嗎
是的。C語言總是從main函數開始執行的。不管你在main函數之前寫了多少函數。都是從main開始。
⑦ C語言 C語言程序為什麼總是從主函數開始執行
各種程序語言都得有一個入口,不然程序怎知道從哪開始運行呢。
C語言規定要從主函數(main)入口開始運行,編譯器也會把main作為程序的入口進行編譯。
⑧ 一個C程序的執行總是從該程序的main函數開始,在main函數最後結束。這句話正確嗎
不會一定在main最後結束!但是從main開始沒錯!main執行一半到別的函數中結束進程,main的結尾就到不了了!
⑨ c程序總是從程序的第一條語句開始執行.對嗎
c程序總是從程序的第一條語句開始執行的說法是錯誤的。
程序執行總是從main函數開始,如果有有其他函數,則完成對其他函數的調用後再返回到主函數,最後由main函數結束整個程序。main函數是程序在有宿主 (hosted)環境(亦即有操作系統)中所指定的入口點。
C程序最大的特點就是所有的程序都是用函數來裝配的。main()稱之為主函數,是所有程序運行的入口。其餘函數分為有參或無參兩種,均由main()函數或其它一般函數調用,若調用的是有參函數,則參數在調用時傳遞。
(9)c語言程序總是從main函數開始執行擴展閱讀:
main()函數的應用形式:
1、函數沒有參數,返回值為 int 類型。
int main( void ) { }
2、函數有兩個參數,類型分別是 int 和 char**,返回值是 int 類型。
int main( int argc, char *argv[ ] ) { }
3、許多 C 的實現版本還支持非標准語法的定義方式:
int main( int argc, char *argv[ ], char *envp[ ] ) { }
函數返回值是 int,有 3 個參數:第一個是 int,另外兩個是 char**。main函數都會把最終的執行狀態以整數的方式傳遞給操作系統。返回值如果是 0 或 EXIT_SUCCESS,就表示程序執行過程一切順利;任何非 0 的返回值,尤其是 EXIT_FAILURE,則表示程序執行時出現了某種問題。