Existe-t-il des équivalents intégrés à _countof
fournis par d’autres compilateurs, en particulier GCC et Clang? Existe-t-il des formes non macro?
En utilisant C ++ 11, la forme non-macro est:
char arrname[5]; size_t count = std::extent< decltype( arrname ) >::value;
Et l’ extent
peut être trouvée dans l’en-tête type_traits
.
Ou si vous voulez que ça ait l’air un peu plus joli, enveloppez-le dans ceci:
template < typename T, size_t N > size_t countof( T ( & arr )[ N ] ) { return std::extent< T[ N ] >::value; }
Et puis ça devient:
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
Edit: Je viens de remarquer le drapeau “C” plutôt que “C ++”. Donc, si vous êtes ici pour C, veuillez ignorer ce post. Merci.
Je n’en connais aucun pour GCC, mais Linux utilise la __builtin_types_compatible_p
intégrée __builtin_types_compatible_p
GCC pour rendre sa macro ARRAY_SIZE()
plus sûre (elle causera une coupure de construction si elle est appliquée à un pointeur):
/* &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))
Note: Je pense que la macro BUILD_BUG_ON_ZERO()
a un nom trompeur (elle provoque un échec de construction si l’expression n’est pas zéro et renvoie 0
sinon):
/* 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 eg in a structure initializer (or where-ever else comma expressions aren't permitted). */ #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
Je pense que le nom de cette macro provient de son examen en deux parties: BUILD_BUG_ON
correspond à ce que la macro fait lorsque l’expression est vraie et ZERO
correspond à la valeur “renvoyée” par la macro (s’il n’y a pas de saut de construction).
Ce?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
Mise à jour: C ++ 17 prend en charge std::size()
(défini dans l’en-tête
)
Vous pouvez utiliser boost::size()
place:
#include int my_array[10]; boost::size(my_array);