Main() 是 C 程式的真正開始嗎?分析違反直覺的程式碼片段
在 C 領域,main() 函數通常被認為是程式執行的起點。然而,一個特殊的程式碼範例挑戰了這個假設。
考慮以下程式碼:
int square(int i) { return i*i; } int user_main() { for ( int i = 0 ; i < 10 ; ++i ) std::cout << square(i) << endl; return 0; } int main_ret= user_main(); int main() { return main_ret; }
在進入表面上的啟動函數 main 之前,這段程式碼似乎列印了從 0 到 9 的整數的平方()。此外,它在 GCC 4.5.0 中的 -pedantic 標誌下編譯時沒有錯誤或警告。
這提出了一個問題:此程式碼是否符合C 標準,該標準在第3.6.1/1 節中規定“程式應包含一個名為main 的全域函數,它是程式的指定開始” ?
解開標準的定義
要回答這個問題,我們必須深入研究標準定義的語意。該標準在其自身使用的上下文中定義了術語“開始”。它沒有聲明在呼叫 main 之前沒有程式碼。相反,它將主函數指定為程式開始執行的點。
在這方面,範例程式碼符合標準。雖然 user_main() 在 main() 啟動之前執行,但根據標準的定義,這發生在程式「啟動」之前。
結論
不尋常的序列此程式碼片段中的執行不會使標準的 main() 標記程式開始的斷言無效。標準對「開始」的定義允許序言程式碼在 main() 之前執行,如這個有趣的程式碼範例所示。因此,儘管該程序有違反直覺的行為,但它仍然完全合規。
以上是C 的「main()」函數是否真正標誌著程式執行的「開始」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!