macro define c arrays gcc macros clang

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.