【问题标题】:How to know the size of a const array?如何知道 const 数组的大小?
【发布时间】:2012-11-14 09:00:19
【问题描述】:

给出以下代码:

const myStr codesArr[] =  {"AA","BB", "CC"};     

myStr 是一个包裹char* 的类。 我需要遍历数组中的所有项目,但我不知道项目的数量。 我不想定义一个 const 值来表示大小(在本例中为 3)

使用类似的东西是否安全:

const int size = sizeof(codesArr) / sizeof(myStr);

怎么办?

【问题讨论】:

  • 这个问题是c还是c++?对于 c++,我真的建议使用 std::array(或 std::tr1::array,如果您的编译器不是 c++11)而不是内置数组。并且可能使用 std::string 而不是 myStr 所做的任何事情
  • 您也可以选择sizeof(codesArr) / sizeof(codesArr[0]);,但有 Luchian Grigore 提到的限制。

标签: c++ c arrays sizeof


【解决方案1】:

执行此操作的安全且清晰的方法是使用std::extent(C++11 起):

const size_t size = std::extent<decltype(codesArr)>::value;

【讨论】:

    【解决方案2】:

    您可以使用int size = sizeof(codesArr) / sizeof(myStr);,只要您不将其作为参数传递给函数,因为这样数组将衰减为指针并丢失大小信息。

    你也可以使用模板技巧:

    template<typename T, int sz>
    int size(T(&)[sz])
    {
        return sz;
    }
    

    【讨论】:

    • sizeof 返回一个 size_t,但我们都将它与 int 一起使用。它是否因为隐式转换而起作用?
    • @Maroun85 是的,有一个隐式转换(不是演员本身)。只要大小可以表示为int,这种转换不会造成任何问题。
    • 你的size()函数在C++11中应该是constexpr,或者在C++03中使用宏技术,这样就可以作为常量表达式使用了。
    • @Nawaz 不可能; constexpr 函数只能有文字类型的参数,即使它们没有被使用。
    • @ecatmur:哦,我不知道。无论如何,在这种情况下,宏观技术就是办法。
    【解决方案3】:

    this link 给出了获取数组大小的最佳方法(c++11 之前)。这是一个复杂的模板技巧,但与上面链接中讨论的其他方法相比具有许多优点。方法是使用如下宏+函数:

    template <typename T, size_t N>
    char ( &_ArraySizeHelper( T (&array)[N] ))[N];
    
    #define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
    

    它的优点之一是它纯粹是一个编译时操作,这比在运行时做的要好,并且,在c++11的constexpr之前 >,是唯一允许您使用操作结果作为另一个数组的大小的方法(因为它是一个编译时间常数

    【讨论】:

    • 这有什么好复杂的?它是模板参数推导的直接使用。 (如果您想要复杂的模板技巧,请查看一些 Boost 资源。)
    • (当然,您的确切代码具有未定义的行为,因为它包含一个以下划线开头后跟大写字母的符号。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2011-04-04
    • 2015-01-15
    • 2015-01-21
    相关资源
    最近更新 更多