我很难理解这个宏是否应该做到了.它是在第三方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中执行此操作,即查找已传递给接受指针的函数的数组的大小.