在VPP代码中我们经常遇到地方使用vec_len的宏,但是不确定为什么就可以这样使用。自己在环境上调试了一下,就理解了。
1、vec变长长数组(data-plane\hdp\hdpinfra\hdpinfra\vec_bootstrap.h)
/*******![在这里插入图片描述](https://img-blog.csdnimg.cn/20181121102144956.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pzaDEzNDE3,size_16,color_FFFFFF,t_70)******************************************************************
> File Name: test.c
> Author: jinshaohui
> Mail: [email protected]
> Time: 18-11-20
> Desc:
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int len;
char data[0];
}vec_header_t;
#define _vec_find(v) ((vec_header_t *) (v) - 1)
#define _vec_len(v) (_vec_find(v)->len)
#define vec_len(v) ((v) ? _vec_len(v) : 0)
int main()
{
vec_header_t *p = NULL;
int *p1 = NULL;
p = malloc(sizeof(vec_header_t) + 10 * sizeof(int*));
p->len = 12;
p1 = (int*)p->data;
printf("\r\n %x %x %x",p,((vec_header_t*)p1),_vec_find(p1));
printf("\r\n p->len: %d \r\n",vec_len(p1));
printf("\r\n sizeof(vec_header_t):%d",sizeof(vec_header_t));
return 0;
}
运行结果如下: