eBPF Talk: 宏的两种写法
文章目录
宏是 C 语言中最强大的语言特性,能够用来简化 eBPF 的 C 代码;毕竟 eBPF 的 C 代码是一种语法、语义都受限的 C 代码,不能像普通 C 代码那样“肆意妄为”。
写法一:带有返回值的多行宏
常见的宏定义是常量定义,如 #define VXLAN_PORT 4789
。可是如果在宏定义中包含有 if
条件判断,该如何编写该宏定义呢?不使用函数来实现,是因为函数需要带上类型,而宏定义则不需要参数的类型。
|
|
如上代码片段,使用 ({})
包裹多行代码,且在第一行声明返回值、在最后一行提供返回值。
参考 BPF_CORE_READ
的宏定义:
|
|
写法二:多行宏的推荐写法
对于多行宏,常见写法如下:
|
|
直接写成多行。可是如果需要在宏里定义一个临时变量,这种写法就行不通了。此时,可以采取下面这种写法:
|
|
使用 do {} while(0)
包裹着多行代码。此时,do-while
里的代码块只会执行一遍。而在使用的时候,像函数调用一样直接使用就可以了,print_ip_version(iph);
。
小结
在 Linux 内核的源代码中,写法二更加常见。而写法一,则是从其它 eBPF 项目中学习到的。
多看源代码,多从源代码中学习。
文章作者 Leon Hwang
上次更新 2022-10-30
知识星球
星球里的专栏:
《XDP 进阶手册》
