// 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
为什么?
就像 Prasoon 所说的那样,它不是一个常量表达式。现在,您可以获得数组大小的常量表达式值,如下所示:
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))
解释这里。您基本上将数组的大小编码为类型的大小,然后获取该类型的
sizeof
,给出:
char q[sizeof_array(p)];
我不敢苟同这里的所有答案。代码显示完全没问题,除了一个小问题(绝对不是 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-“结果是一个常数 输入 size_t。 [注:size_t已定义 在标准标题 (18.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’