簡體   English   中英

C ++聲明'main'作為函數的引用?

[英]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 顯然,它無法知道為main1main2執行此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM