34

是否有_countof其他编译器提供的内置等效项,特别是 GCC 和 Clang?有没有非宏形式?

4

4 回答 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 回答