在另一个数组中使用一个数组的大小

时间:2010-09-30 13:48:41

标签: c++ arrays templates size

// sizeofarray.cpp
#include <iostream>
template <typename T,int N>
int size(T (&Array)[N])
{
  return N;
}

int main()
{
   char p[]="Je suis trop bon, et vous?";
   char q[size(p)]; // (A)
   return 0;
}

我听说C ++中的数组大小必须是一个常量表达式。所以char q[size(p)]无效,我是对的吗?但是当我尝试

时,我没有遇到任何错误
 g++ -Wall sizeofarray.cpp

为什么?

4 个答案:

答案 0 :(得分:7)

Prasoon says一样,它不是一个常量表达式。现在,您可以获得数组大小的常量表达式值,如下所示:

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))

解释here。您基本上将数组的大小编码为类型的大小,然后获取该类型的sizeof,为您提供:

char q[sizeof_array(p)];

答案 1 :(得分:4)

  

我听说C ++中的数组大小必须是一个常量表达式。

正确

  

所以char q [size(p)]无效,对不对?

根据ISO C ++,是的!

  

但是当我尝试

时我没有错误      

g ++ -Wall sizeofarray.cpp

那是因为g ++支持VLA(Variable Length Array)作为扩展。

C++0x中有constexpr功能,可以帮助您编写

constexpr int size(T (&Array)[N])
{
  return N;
}

然后char q[size(p)]将是合法的。

编辑:另请阅读this文章[博客无论如何]

答案 2 :(得分:-1)

我不同意这里的所有答案。除了一个小问题(绝对不是VLA)之外,代码显示完全没问题

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

int main() 
{ 
   char p[]="Je suis trop bon, et vous?"; 
   char q[sizeof(p)]; // (A), not sizeof and not size as in OP
   return 0; 
} 

我想知道sizeof的结果总是一个const值,因此代码应该没问题。

以上代码在VS 2010和Comeau(严格模式)

上构建良好
  

$ 5.3.3 / 6-“结果是常数   type size_t。 [注意:size_t已定义   在标准标题(18.1)中。“

答案 3 :(得分:-1)

我使用g ++ 4.4.3并使用以下别名,以便我永远不会忘记打开警告:

$ alias g++
alias g++='g++ -ansi -pedantic -Wall -W -Wconversion -Wshadow -Wcast-qual -Wwrite-strings'

如果使用上述内容进行编译,则会出现一些警告。以下步骤显示了不同选项如何显示不同的警告。

没有警告选项的编译不会显示任何警告

$ \g++ sizeofarray.cpp 

开启-Wall

$ \g++ -Wall sizeofarray.cpp
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: unused variable ‘q’

开启-Wextra

$ \g++ -Wall -Wextra sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: unused variable ‘q’
sizeofarray.cpp: At global scope:
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’:
sizeofarray.cpp:12:   instantiated from here
sizeofarray.cpp:4: warning: unused parameter ‘Array’

最后打开-pedantic来抓住真正的问题

$ \g++ -Wall -Wextra -pedantic  sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: ISO C++ forbids variable length array ‘q’
sizeofarray.cpp:12: warning: unused variable ‘q’
sizeofarray.cpp: At global scope:
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’:
sizeofarray.cpp:12:   instantiated from here
sizeofarray.cpp:4: warning: unused parameter ‘Array’