2012-03-13 17 views
8

Visual C++ 10 jest dostarczany z stdlib.h który między innymi zawiera ten klejnot:Jaki jest cel dodawania manekina w tym makrze "liczby elementów"?

template <typename _CountofType, size_t _SizeOfArray> 
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; 

#define _countof(_Array) (sizeof(*__countof_helper(_Array)) + 0) 

który wykorzystuje a clever template trick to deduce array size i zapobiec wskazówek przed przeszedł do __countof.

Jaki jest cel definicji + 0 w definicji makra? Jaki problem rozwiązuje?

+0

The Jedyne, co mogę wymyślić, to uniemożliwić zastosowanie w szablonowych specjalizacjach. To jednak ograniczenie. – Pubby

+0

Oczywiście, jeśli VS2010 obsługuje 'constexpr', wówczas będzie to:' template constexpr size_t size (T (&) [N]) {return N; } ' –

Odpowiedz

14

Cytowanie STL z here

Zrobiłem tę zmianę; Zwykle nie włamuję się do CRT, ale ten był banalny. Wyciszenie + 0 fałszywe "ostrzeżenie C6260: sizeof * sizeof jest zwykle błędne. Czy zamierzałeś użyć liczby znaków lub bajtu ?" z/zanalizuj, gdy ktoś napisze _countof (arr) * sizeof (T).

2

Jaki jest cel + 0 w definicji makra? Jaki problem rozwiązuje go ?

Nie wydaje mi się, żeby to rozwiązało jakikolwiek problem. Może być użyty do wyciszenia ostrzeżenia, o którym mowa w innej odpowiedzi.

Na Ważna uwaga, po to kolejny sposób na znalezienie rozmiar tablicy w czasie kompilacji (osobiście uważam, że bardziej czytelny):

template<unsigned int SIZE> 
struct __Array { char a[SIZE]; } 

template<typename T, unsigned int SIZE> 
__Array<SIZE> __countof_helper(const T (&)[SIZE]); 

#define _countof(_Array) (sizeof(__countof_helper(_Array))) 

[PS: Potraktuj to jako komentarz]

+0

Złe nazwy identyfikatorów ... Złe nazwy identyfikatorów! – Xeo

+0

@Xeo, założył, że jest to używane dla kodu biblioteki (OP), który już zawiera '__' i' _', po których następują czapki. Skopiowane ze źródła w pytaniu. – iammilind

+0

@iammilind: Uważam, że jest to również bardziej czytelne, jednak dobrą rzeczą w sposobie VS jest to, że unika wprowadzania fałszywej "struktury". –