[英]C++ declare 'main' as a reference to function?
如果我將main定義為函數的引用怎么辦?
#include<iostream>
#include<cstring>
using namespace std;
int main1()
{
cout << "Hello World from main1 function!" << endl;
return 0;
}
int (&main)() = main1;
會發生什么? 我在一個在線編譯器中測試了錯誤“Segmentation fault”:
在VC ++ 2013下,它將在運行時創建程序崩潰!
將編譯將函數指針的數據作為代碼調用的代碼,該代碼將在啟動時立即崩潰。
我還想要一個關於這個的ISO C ++標准報價。
如果你想根據某些宏定義2個入口點中的任何一個,這個概念會很有用:
int main1();
int main2();
#ifdef _0_ENTRY
int (&main)() = main1;
#else
int (&main)() = main2;
#endif
這不是一個符合要求的C ++程序。 C ++要求(第3.6.1節)
程序應包含一個名為
main
的全局函數
您的程序包含一個名為main
的全局非函數,它引入了與所需main
函數的名稱沖突。
這樣做的一個理由是它允許托管環境在程序啟動期間對main
進行函數調用。 它不等同於源字符串main(args)
,它可以是函數調用,函數指針取消引用,在函數對象上使用operator()
,或者構造main
類型的實例。 不, main
必須是一個功能。
還有一點需要注意的是,C ++標准從未說明main
實際類型,並阻止您觀察它。 所以實現可以(並且做!)重寫簽名,例如添加你省略的任何int argc, char** argv, char** envp
。 顯然,它無法知道為main1
和main2
執行此main2
。
如果要根據某些宏定義2個入口點中的任何一個,這將非常有用
不,不是真的。 你應該做這個:
int main1();
int main2();
#ifdef _0_ENTRY
int main() { return main1(); }
#else
int main() { return main2(); }
#endif
由於CWG問題1886的解決方案目前處於“暫時准備好”狀態,其中包括以下[basic.start.main]以下內容,因此很快就會變得明顯不合格:
在全局范圍內聲明變量
main
或使用C語言鏈接(在任何命名空間中)聲明名稱main
是不正確的。
在實踐中會發生什么在很大程度上取決於實施。
在您的情況下,您的編譯器顯然將該引用實現為“偽裝指針”。 除此之外,指針還有外部鏈接。 即你的程序導出一個名為main
的外部符號,它實際上與指針占用的數據段中的內存位置相關聯。 鏈接器在不過多考慮的情況下,將內存位置記錄為程序的入口點。
稍后,嘗試將該位置用作入口點會導致分段錯誤。 首先,該位置沒有有意義的代碼。 其次,僅僅嘗試將控制權傳遞給數據段內的某個位置可能會觸發平台的“數據執行保護”機制。
通過這樣做,你顯然希望引用將被優化,即main
將成為main1
另一個名稱。 在你的情況下,它沒有發生。 該參考作為獨立的外部對象存活。
看起來你已經回答了關於會發生什么的問題。
至於為什么,在你的代碼main
是一個函數的引用/指針。 這與功能不同。 如果代碼調用指針而不是函數,我會期望段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.