![](/img/trans.png)
[英]Computing length of a C string at compile time. Is this really a constexpr?
[英]Computing length of array
我有一个C ++数组声明如下所述:
CString carray[] =
{
"A",
"B",
"C",
"D",
"E"
}
我想在运行时确定carray
的长度。 我在做:
int iLength = sizeof(carray)/sizeof(CString);
它是否正确?
您可以使用以下功能模板。 如果你正在使用Boost,你可以调用boost::size
。
template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
return N;
}
int iLength = size(carray);
然而,正如其他人已经说过的那样,你应该更喜欢std::vector
到C风格的数组。
是。 如果声明的元素类型发生变化,您也可以编写
int iLength = sizeof(carray)/sizeof(carray[0]);
这是正确的,因为它使用元编程:
template <typename T, std::size_t N>
inline std::size_t array_size( T (&)[N] ) {
return N;
};
你必须知道,当编译器看到数组定义时,这是有效的,但是在它被传递给函数(它衰变成指针的地方)之后就不会这样:
void f( int array[] )
{
//std::cout << array_size( array ) << std::endl; // fails, at this point array is a pointer
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
f( array );
std::cout << array_size( array ) << std::endl; // 5
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5
}
这段代码是正确的,但在大多数情况下,有更好的方法来处理C ++中的数组。 特别是因为此方法不适用于动态大小的数组。
对于这种情况,请使用标准库类std::vector
来表示动态大小的数组(即,您可以插入和删除条目)。
是的,这是正确的方法,但它只适用于在编译时已知数组大小并且在sizeof( array )
语句的站点上看到的情况。 它不适用于动态大小的数组 - 你需要其他方法,例如使用像stl :: vector这样的容器,或者将元素数作为单独的参数传递/存储。
那不是运行时,它是编译时间。 你使用的方式是正确的。 请注意,Visual Studio定义了一个执行相同操作的_countof
函数。
在运行时,无法确定长度。 你要么自己保持一定长度,要么使用std::vector
如果你有一个动态数组,你应该使用类似STL向量的东西。 http://www.cppreference.com/wiki/stl/vector/start
C ++中的普通数组是固定大小的,您需要手动分配内存以扩展动态数组。
如果在编译时知道数组大小,请使用常量而不是计算。
阅读Ivan J. Johnson在Dobbs Journal 博士的 这篇文章。 我认为它涵盖了此处介绍的大部分解决方案。 它还非常清楚地概述了每种方法的优点和缺点。
Windows SDK(即windows.h标头)提供宏ARRAYSIZE,它以安全的方式实现此功能(即不适用于非静态数组)
最好的方法是使用宏并在需要大小的地方使用它。
#define MAX_ROWS 1048
int array[MAX_ROWS];
这样,即使在将数组作为参数传递的函数中,也可以使用MAX_ROWS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.