2012-01-23 57 views
2

我想有以下方法作爲任何陣列的通用方法,爲什麼C++禁止沒有類型的參數聲明?

int arrayLength(`anyType` array[]) 
{ 
    return sizeof(array)/sizeof(array[0]); 
} 

但是似乎C++不允許類型的任何含糊之處可言,

這是爲什麼,以及如何我應該着手解決嗎?

+8

'template std :: size_t arrayLength(T(&)[N]){return N; }' – ildjarn

+0

Duplicate:http://stackoverflow.com/questions/4415524/common-array-length-macro-for-c –

+0

另一個相關的線程:http://stackoverflow.com/questions/95500/can-this-macro被轉換成函數 – Troyseph

回答

3

因爲類型必須推入堆棧然後彈出,sizeof一種類型不等於sizeof另一種類型。

如果在函數之間堆棧上傳遞的類型的大小不是固定的或者是事先不知道的,編譯器如何編譯一個函數?

正如其他人已經注意到的那樣,這個問題的解決方案是模板和宏,它們都動態生成代碼 - 然後在編譯時編譯 - 看起來像「求解「的問題,但實際上只是通過將工作卸載到編譯器上來消除或分散您的注意力。

1

在Visual C++中,有一個__countof()結構可以實現相同的功能。它被實現爲C++編譯模板,並作爲C的宏實現。如果在指針上使用C++版本的錯誤(與真正的數組相反),C版本不會。

1

我想你真正要問的是「爲什麼C++堅持靜態類型?」

答案:因爲如果語言使用靜態類型,編寫能夠生成小型快速程序的編譯器會更容易。這就是C++的目的:創建小型,快速的程序,如果用C編寫,其複雜性將是相對難以管理的。

當我說「小」時,我包含任何所需運行時庫的大小。

相關問題