2016-04-26 32 views
0

在託管系統中,標準要求main應使用「int類型的聲明返回類型」進行定義。這裏的「聲明」屬於「推導出的返回類型」,因此我們可以忽略該詞用於此問題。在C語言中,該標準明確指出typedef可用於int,但在C++標準中缺少該腳註。我打算假設語言是「返回類型int」和「()返回int」的函數,而typedef只是一個別名,而不是一個不同的類型。因此這個程序將被認爲是合法的:「main」的這個定義合法嗎?

typedef int boobs; 
boobs main() { } 

如果我們這樣做呢?

#include <cstdint> 

int32_t main() {} 

在很多系統中,這將編譯爲int32_t只是int,但不是所有的系統。我的困惑源於這樣的事實:int32_t是一個實現定義的值,這意味着編譯失敗取決於實現。

那麼這種情況的合法性是什麼?整個程序是否因爲有時可以編譯而不合格?還是它是格式良好的,因爲它取決於來自標準庫的實現定義的值?

+0

'所以我們可以忽略這個詞 - '離開這個 –

+1

我會用這個嗎?我的意思是,如果它只有在'int32_t'只是'int'的情況下才起作用,那麼你可以首先使用'int' – user463035818

+1

「編譯失敗取決於實現」---是的,可能發生,沒什麼不尋常的 – Brian

回答

4

當且僅當int32_tint的別名(typedef)時,該程序格式正確。

顯然,在不支持int32_t(固定寬度整數是可選的)的系統中,使用未聲明的int32_t是非法的。

而且,即使int32_t是由編譯器的支持,並不需要報關的全局命名空間在頭<cstdint>(僅std::int32_t保證),因此該方案依賴於實施的這一方面。

另外,在int32_t是與int不同的另一種類型的系統中,該程序將會形成病態。

因此,它是實現的定義,無論程序是否形成良好。在某些系統上,它是;在別人身上卻不是。簡而言之,該計劃的條件良好。