macro - define c++
¿Equivalentes a la cuenta de MSVC en otros compiladores? (4)
¿Existen equivalentes incorporados a _countof proporcionados por otros compiladores, en particular GCC y Clang? ¿Hay alguna forma no macro?
¿Esta?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
Actualización: C ++ 17 support std::size() (definido en el encabezado <iterator> )
Puedes usar boost::size() lugar:
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);
No conozco uno para GCC, pero Linux usa __builtin_types_compatible_p de GCC para hacer que su macro ARRAY_SIZE() más segura (causará un salto de compilación si se aplica a un puntero):
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) /
BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
Nota: Creo que la macro BUILD_BUG_ON_ZERO() tiene un nombre engañoso (causa una falla de compilación si la expresión no es cero y, de lo contrario, devuelve 0 ):
/* Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren''t permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
Creo que la denominación de esta macro proviene de verla en dos partes: BUILD_BUG_ON es lo que hace la macro cuando la expresión es verdadera, y ZERO es el valor ''devuelto'' por la macro (si no hay un corte de construcción).
Usando C ++ 11, la forma no macro es:
char arrname[5];
size_t count = std::extent< decltype( arrname ) >::value;
Y la extent se puede encontrar en el encabezado type_traits .
O si quieres que se vea un poco mejor, envuélvelo en esto:
template < typename T, size_t N >
size_t countof( T ( & arr )[ N ] )
{
return std::extent< T[ N ] >::value;
}
Y luego se convierte en:
char arrname[5];
size_t count = countof( arrname );
char arrtwo[5][6];
size_t count_fst_dim = countof( arrtwo ); // 5
size_t count_snd_dim = countof( arrtwo[0] ); // 6
Edición: Acabo de notar la bandera "C" en lugar de "C ++". Así que si estás aquí por C, por favor ignora esta publicación. Gracias.