其他编译器提供的_countof
是否有内置的等价物,特别是GCC和Clang?有没有非宏观形式?
答案 0 :(得分:12)
使用C ++ 11,非宏形式是:
char arrname[5];
size_t count = std::extent< decltype( arrname ) >::value;
可以在extent
标题中找到type_traits
。
或者如果你希望它看起来更好一些,请将其包装在:
中template < typename T, size_t N >
size_t countof( T ( & arr )[ N ] )
{
return std::extent< T[ N ] >::value;
}
然后它变成:
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
编辑:我刚注意到“C”标志而不是“C ++”。所以,如果你来这里是C,请好好忽略这篇文章。感谢。
答案 1 :(得分:6)
我不知道有一个用于GCC,但是Linux使用GCC's __builtin_types_compatible_p
builtin使他们的ARRAY_SIZE()
宏更安全(如果应用于指针,它将导致构建中断):
/* &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))
注意:我认为BUILD_BUG_ON_ZERO()
宏具有误导性名称(如果表达式不为零则导致构建失败,否则返回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); }))
我认为这个宏的命名来自于它分为两部分:BUILD_BUG_ON
是表达式为true时宏所执行的操作,而ZERO
是宏返回的值(如果没有构建中断)。
答案 2 :(得分:5)
此?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
答案 3 :(得分:4)
更新:C ++ 17支持std::size()
(在标题<iterator>
中定义)
您可以改为使用boost::size()
:
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);