亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

main()真的是一個C ++程序的開始嗎?

main()真的是一個C ++程序的開始嗎?

C++
慕村9548890 2019-09-20 14:45:03
C ++標準中的$ 3.6.1 / 1節,程序應包含一個名為main的全局函數,它是程序的指定開始?,F在考慮這段代碼,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的整數平方。我還用-pedantic選項GCC 4.5.0 編譯它。它沒有錯誤,甚至沒有警告!所以我的問題是,這段代碼真的符合標準嗎?如果它符合標準,那么它是否會使標準所說的無效?main()不是這個計劃的開始!user_main()在執行之前執行main()。我知道要初始化全局變量main_ret,use_main()首先執行,但這是完全不同的事情; 關鍵是,它確實使標準中的引用語句$ 3.6.1 / 1無效,因為main()它不是程序的開始 ; 事實上,這個計劃已經結束了!編輯:你如何定義'開始'這個詞?它歸結為“程序開始”這一短語的定義。那么你究竟如何定義呢?
查看完整描述

3 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

不,C ++在調用main之前做了很多事情來“設置環境”; 但是,main是C ++程序中“用戶指定”部分的正式啟動。

一些環境設置是不可控的(比如設置std :: cout的初始代碼;但是,某些環境可以像靜態全局塊一樣控制(用于初始化靜態全局變量)。注意,因為你沒有完整在main之前控制,您無法完全控制靜態塊初始化的順序。

在main之后,您的代碼在概念上“完全控制”程序,在某種意義上,您既可以指定要執行的指令,也可以指定執行它們的順序。多線程可以重新排列代碼執行順序; 但是,你仍然可以控制C ++,因為你指定讓代碼段執行(可能)亂序。


查看完整回答
反對 回復 2019-09-20
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

你正在錯誤地閱讀這句話。

程序應包含一個名為main的全局函數,它是程序的指定開始。

該標準是為了標準的其余部分而定義“開始”一詞。它并沒有說在main調用之前沒有代碼執行。它說程序的開始被認為是在功能上main。

您的計劃符合要求。在main啟動之前,您的程序尚未“啟動”。根據標準中“start”的定義,在程序“啟動”之前調用構造函數,但這幾乎不重要。代碼很多被執行前main不斷調用每一個程序,不只是這個例子。

出于討論的目的,您的構造函數代碼在程序的“開始”之前執行,并且完全符合標準。


查看完整回答
反對 回復 2019-09-20
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

除非有主程序,否則您的程序將不會鏈接,因此不會運行。但是main()不會導致程序執行的開始,因為文件級別的對象具有預先運行的構造函數,并且可以在main()到達之前編寫一個運行其生命周期的整個程序,并讓main本身具有一個空的身體。


實際上要強制執行此操作,您必須擁有一個在main及其構造函數之前構造的對象來調用程序的所有流程。


看這個:


class Foo

{

public:

   Foo();


 // other stuff

};


Foo foo;


int main()

{

}

你的程序流程將有效地源于 Foo::Foo()


查看完整回答
反對 回復 2019-09-20
  • 3 回答
  • 0 關注
  • 435 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號