Vpp原始碼分析之 vec_len 巨集的理解
阿新 • • 發佈:2018-12-02
在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; }
執行結果如下: