2012-03-13 16 views
8

Visual C++ 10 se envía con stdlib.h que entre otras cosas contiene esta joya:¿Cuál es el propósito de la adición ficticia en esta macro de "número de elementos"?

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

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

el cual utiliza a clever template trick to deduce array size y evitar punteros de ser pasado a __countof.

¿Cuál es el propósito de + 0 en la definición de macro? ¿Qué problema soluciona?

+0

El lo único que se me ocurre es evitar que se pueda usar en especializaciones de plantilla. Sin embargo, eso es una limitación. – Pubby

+0

Por supuesto, si VS2010 admite 'constexpr', entonces sería:' template constexpr size_t size (T (&) [N]) {return N; } ' –

Respuesta

14

Citando STL de here

hice este cambio; Normalmente no pirateo el CRT, pero este fue trivial. El + 0 silencia una "advertencia espuria C6260: sizeof * sizeof por lo general es incorrecta. ¿Tenía la intención de utilizar un recuento de caracteres o un byte recuento?" desde/analice cuando alguien escribe _countof (arr) * sizeof (T).

2

¿Cuál es el propósito de + 0 en la definición de macro? ¿Qué problema resuelve ?

No me parece que resuelva ningún problema. Puede usarse para silenciar alguna advertencia como se menciona en otra respuesta.

En la nota importante, que sigue es otra forma de encontrar el tamaño de la matriz en tiempo de compilación (personalmente me resulta más fácil de leer):

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: considerar esto como un comentario]

+0

Nombres de identificadores erróneos ... ¡Nombres de identificadores erróneos! – Xeo

+0

@Xeo, supone que esta se utiliza para código de la biblioteca (OP), que ya contiene '__' y' _' seguido de tapas. Copiado de la fuente en la pregunta. – iammilind

+0

@iammilind: También me parece más legible, sin embargo, lo bueno de VS es que evita introducir una 'struct' falsa. –

Cuestiones relacionadas