使用宏查找C中的数组大小

时间:2011-09-19 14:27:26

标签: c c-preprocessor

我无法理解这个宏是否应该做到了。它是在第三方dll我包装。

#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#define GTO_ARG_SIZE(arg) (long)((arg)==NULL ? 0 : (long)(arg)[0])

它应该给出arg的长度,其中arg在我的情况下是长*。它只是指向一个很长的但是当arg是一个longs数组时也会使用Macro ...

根据我的理解,如果指针不为NULL,它将返回arg [0]的值。但是当arg指向long时,它返回long的值,而不是arg(1)的大小......

解决:

像你们许多人所说的那样,神秘的结构包含了它作为第一个元素的大小。对不起,我没有关于DLL的文档,所以我只是在挖掘了一些代码之后才想出来。我一开始想知道我是否真的对C / C ++知之甚少。 谢谢大家

2 个答案:

答案 0 :(得分:12)

也许第三方DLL假定数组是这样表示的,第一个元素包含长度?如果数组也是基于1并进行边界检查的话,这将是有道理的。

当您没有提供有关代码的更多详细信息时,很难更具体。

计算数组长度的更经典的宏是:

#define ARRAY_SIZE(x) ((sizeof x) / (sizeof *x))

请注意,这仅适用于数组声明在范围内的实际数组。特别是, 在C:

中工作
size_t array_length(const int *data)
{
  /* Note: this is a negative example: IT DOES NOT WORK. */
  return ARRAY_SIZE(data);
}

int main(void)
{
  int test[4711];

  printf("the test[] array is %zu elements long\n", array_length(test));
  return 0;
}

以上不会打印4711;数组的大小不是函数调用中数组衰减const int *类型的一部分。通常不可能在C中执行此操作,即查找已传递给接受指针的函数的数组的大小。

答案 1 :(得分:1)

这只返回arg指向的long,如果指针为null,则返回零。

我能看到这个返回arg长度的唯一方法是,如果arg是指向结构(或结构的长成员)的指针,它恰好代表了它所使用的结构的长度,就像是但是远射。

编辑 - 这个神秘的结构更可能是一个带有边界信息的数组,因为展开说法比其他任何东西都要好。