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

nch*_*che 2 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])
Run Code Online (Sandbox Code Playgroud)

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

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

解决:

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

unw*_*ind 12

也许第三方DLL假设数组表示如此,第一个元素包含长度?如果数组也是基于1并且经过边界检查,这将是有意义的.

当你没有提供有关代码的更多细节时,很难更具体.

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

#define ARRAY_SIZE(x) ((sizeof x) / (sizeof *x))
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于实际数组,其中数组声明在范围内.这一点,尤其是不不是用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;
}
Run Code Online (Sandbox Code Playgroud)

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