[英]Length of arbitrary array type in C function
我想用C中的实际函数替换下面的宏。
#define ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
保持你的宏。 替换它是一个错误。 将数组传递给函数时,它会衰减为指针并丢失大小信息。
正如其他人所说,你做不到。
将参数传递给函数时,该表达式的值将复制到新对象中。
一个问题是函数不能将数组作为参数。 函数原型中的数组声明将转换为指针声明。
类似地,表示您传递的数组的表达式将转换为指向数组的第一个元素的指针。
阻碍你的另一个问题是C没有通用功能 。 除了使用void *
参数和单独传递大小信息之外,没有办法提供带有“T数组”的函数,其中T可以是您喜欢的任何类型。
但是,类似函数的宏在不同的阶段扩展。 它们在编译期间被翻译; 想象一下,在编译之前复制并粘贴宏所提到的代码,替换参数。 这就是您的编译器对宏所做的事情。
例如,当你写printf("%zu\\n", ARRAY_LENGTH(foo));
它替换为: printf("%zu\\n", (sizeof(foo)/sizeof((foo)[0])));
。
PS sizeof
不是函数; 它是一个运算符......巧合的是,它是为数不多的(其他是&
address-of运算符和新采用的_AlignOf
运算符)之一,它们不会将数组表达式转换为指针表达式 。
int arraySz(void **a)
{
return(sizeof(a[])/sizeof(a[][]));
}
然而一个将必须被指向到现有的矩形阵列,而不是只是一个指向指针的指针,或通过malloc返回值()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.