// 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
为什么?
答案 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’