是否有_countof
其他编译器提供的内置等效项,特别是 GCC 和 Clang?有没有非宏形式?
问问题
19771 次
4 回答
18
使用 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 来的,请忽略此帖子。谢谢。
于 2012-12-06T16:12:39.893 回答
10
更新:C++ 17 支持std::size()
(在 header 中定义<iterator>
)
您可以boost::size()
改用:
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);
于 2014-09-10T09:45:57.803 回答
8
我不知道 GCC 有一个,但是 Linux 使用GCC 的__builtin_types_compatible_p
内置函数来使它们的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
当表达式为真时宏的作用,以及ZERO
宏“返回”的值(如果没有构建中断)。
于 2010-12-11T06:57:56.197 回答
6
这?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
于 2010-12-11T06:39:53.217 回答