gpt4 book ai didi

c - 用宏找出C语言中数组的大小

转载 作者:行者123 更新时间:2023-12-04 11:06:08 25 4
gpt4 key购买 nike

我很难理解此宏是否应执行的操作。它在我正在包装的第三方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在我的情况下是长*。它只是指向一个long,但是当arg是long数组时,也会使用宏。

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

解决:

就像你们中许多人所说的那样,神话般的结构将其大小作为第一个元素。抱歉,我没有关于dll的文档,因此仅在对代码进行了深入研究之后才弄清楚。首先,我想知道我是否真的对C / C ++不太了解。
谢谢大家

最佳答案

也许第三方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语言中执行此操作,即查找已传递给接受指针的函数的数组的大小。

关于c - 用宏找出C语言中数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com