2011-05-24 11 views
3

我發現this article,帶來了以下方案並獲得數組大小的宏:「sizeof」如何在此幫助程序中用於確定數組大小?

template<typename Type, size_t Size> 
char (&ArraySizeHelper(Type(&Array)[Size]))[Size]; 
#define _countof(Array) sizeof(ArraySizeHelper(Array)) 

,我發現下面的部分完全不清楚。 sizeof適用於函數聲明。我希望結果是「函數指針的大小」。爲什麼它會取得「返回值的大小」呢?

+4

不,它應用於函數返回值。 – 2011-05-24 05:50:43

+1

只需要注意,在C++ 11中,他可以在中途嘗試的'countof'函數產生一個編譯時常量。 – 2011-05-24 06:32:42

回答

5
template<typename Type, size_t Size> 
char (&ArraySizeHelper(Type(&Array)[Size]))[Size]; 
#define _countof(Array) sizeof(ArraySizeHelper(Array)) 

sizeof被施加到函數聲明。我希望結果是「函數指針的大小」。爲什麼它會取得「返回值的大小」呢?

這不是sizeof ArraySizeHelper(這將是非法的 - 不能採取sizeof功能),也不sizeof &ArraySizeHelper - 甚至沒有隱含的隱式轉換,從功能到指針到功能明確的標準不允許的,對於C++ 0x見5.3.3)。相反,它是sizeof ArraySizeHelper(Array),相當於sizeof函數調用返回的值,即sizeof char[Size]因此Size

3

ArraySizeHelper是一個函數模板,它返回一個大小爲Sizechar數組。該模板需要兩個參數,一個是類型(即Type),另一個是(即Size)。

所以,當你傳遞一個類型的對象,比如說,A[100]到函數。編譯器推導出模板的兩個參數:Type變爲A,並且Size變成100

所以實例化的函數返回類型變爲char[100]。由於sizeof的參數從未被評估,所以該功能不需要具有定義sizeof只需要知道返回類型的功能是char[100]。這相當於sizeof(char[100]),它返回100 - 數組的大小。

另一個有趣的一點要注意的是,sizeof(char)未編譯器相關,不同於其他類型的原語(比 的變體以外)。其總是1。所以sizeof(char[100])保證是100

1. char所有變體的大小是一個,根據該標準是它charsigned charunsigned char

+0

爲什麼sizeof(char [100])而不是「函數指針的大小」? – sharptooth 2011-05-24 05:48:51

+0

@sharptooth:因爲這是一個函數調用。 'sizeof'和'decltype'對函數調用的返回類型進行操作。 – Xeo 2011-05-24 05:50:02

+0

@sharptooth:解釋說增加幾句話。 – Nawaz 2011-05-24 05:51:52

6

sizeof被施加到函數呼叫,未聲明的結果。因此它給出了返回值的大小,在這種情況下是對一個字符數組的引用。

該模板使返回類型中的數組與參數數組具有相同數量的元素,該數組從元素饋送給該函數。

最後,sizeof然後應用於對此char數組的引用。 sizeof上的引用與該類型本身上的sizeof相同。由於sizeof(char) == 1,這給出了數組中的元素數量。

相關問題