在其他编译器中等同于MSVC的_countof?

时间:2010-12-11 06:30:20

标签: c arrays gcc macros clang

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

4 个答案:

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