我想用C中的实际函数替换下面的宏。
#define ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
答案 0 :(得分:1)
保持你的宏。替换它是一个错误。将数组传递给函数时,它会衰减为指针并丢失大小信息。
答案 1 :(得分:1)
正如其他人所说,你做不到。
将参数传递给函数时,该表达式的值将复制到新对象中。
一个问题是functions can't have arrays as arguments.函数原型中的数组声明被转换为指针声明。
类似地,表示您传递的数组的表达式将转换为指向数组的第一个元素的指针。
阻碍你的另一个问题是C没有泛型函数。没有办法提供带有“T数组”的函数,其中T可以是您喜欢的任何类型,除了使用void *
参数并分别传递大小信息。
然而,在不同阶段扩展的类似函数的宏。它们在编译期间被翻译;想象一下,在编译之前复制并粘贴宏所提到的代码,替换参数。这就是你的编译器用宏做的事情。
例如,当您撰写printf("%zu\n", ARRAY_LENGTH(foo));
时,它会将其替换为:printf("%zu\n", (sizeof(foo)/sizeof((foo)[0])));
。
P.S。 sizeof
不是一个功能;它是一个运算符......巧合的是,它是为数不多的(其中一个是&
地址 - 运算符和新采用的_AlignOf
运算符)之一,它们不会导致数组表达式转换为指针表达式。
答案 2 :(得分:-5)
~
然而 a 必须指向现有的矩形数组,而不仅仅是指向指针的指针,或者从 malloc()返回值。