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.