在GCC 4.6中嘗試了這一點,它編譯和鏈接,但在運行時在MacOS上發出「總線錯誤」消息。 VS2010甚至沒有編譯它。這是正確的C++ 0x代碼嗎?
但問題是,如果這實際上工作在標準的C++ 0x?
#include <cstdio>
int (*main)()=[]()->int{printf("HEY!\n");return 0;};
是的,它試圖做的是將「main」定義爲lambda函數。
在GCC 4.6中嘗試了這一點,它編譯和鏈接,但在運行時在MacOS上發出「總線錯誤」消息。 VS2010甚至沒有編譯它。這是正確的C++ 0x代碼嗎?
但問題是,如果這實際上工作在標準的C++ 0x?
#include <cstdio>
int (*main)()=[]()->int{printf("HEY!\n");return 0;};
是的,它試圖做的是將「main」定義爲lambda函數。
不,這是不正確的。
Main是一個特殊的函數,它對它有嚴格的要求(甚至比普通函數更嚴格),但是你也對函數的功能和指向函數的指針有些混淆。
邏輯問題是函數和變量之間存在一個指針函數的指針(你想要的主要是什麼)之間的區別。 一個函數在內存中有一個固定的地址,所以調用一個簡單調用地址的函數。一個函數指針指向到內存中的一個地址,所以調用你需要的函數首先讀取指針指向的內容,然後調用該地址。
指向函數的指針與函數具有不同的間接級別。
的語法是一樣的......也就是說,如果x
是指向一個功能,你可以寫x(42)
,但仍生成的機器代碼是不同的,如果x
是不是函數(在指針的值必須的情況下,被查詢並且呼叫地址在運行時被確定,具有地址被固定的功能 - 直到重定位 - 並且在鏈路時間被確定)。
對於編譯器和標準庫實現之間的可移植性,當#including <cstdio>
時,printf()必須是std :: printf()。還有關於無效main()的其他內容。
不,在標準中沒有規定'cXXX'是否包含注入全局名稱空間。使用'std ::'是_wise_,但是「must」可能是一種矯枉過正的行爲。 – paxdiablo
好的,無論如何,這是一個半開玩笑。我將編輯答案,注意它是可移植性所必需的。 (我們這些編寫便攜代碼爲生的人開始思考這種方式......) –
我喜歡你嘗試使用C++ 11的最新,最好的高級功能,但仍堅持使用'cstdio'和'printf' :-) – paxdiablo
@paxdiablo:printf rocks !!! C++在I/O流失敗:) – 2011-09-28 12:58:23
根據Stroustroup ...如果C讓你在腳下射擊,C++可以把你所有的腿擊倒!這就是我所說的......受虐狂! :-)) –