Équivalents au nombre de MSVC dans d’autres compilateurs?

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);