当前位置: 首页 > news >正文

strongswan中METHOD定义

strongswan中使用METHOD来定义函数(方法),如下get_first函数定义。

METHOD(linked_list_t, get_first, status_t,private_linked_list_t *this, void **item)
{if (this->count == 0)return NOT_FOUND;*item = this->first->value;return SUCCESS;
}

METHOD宏定义如下:

#define METHOD(iface, name, ret, this, ...) \static ret name(union {iface *_public; this;} \__attribute__((transparent_union)), ##__VA_ARGS__); \static typeof(name) *_##name = (typeof(name)*)name; \static ret name(this, ##__VA_ARGS__)

METHOD宏各个参数的说明以及对应于的get_first函数的各个参数如下。

iface - 公共结构           - linked_list_t
name  - 函数(方法)名称   - get_first
ret   - 函数返回值类型     - status_t
this  - 私有结构           - private_linked_list_t *this
...   - 可变参数           - void **item

METHOD宏重新布局如下。其由三部分组成,第一部分为函数声明,首个参数为transparent_union属性修饰的联合体,联合体内容为对应结构(如linked_list_t)的公共和私有结构体;

#define METHOD(iface, name, ret, this, ...) \static ret name(union {                 \iface *_public;       \this;                               \} __attribute__((transparent_union)), \\##__VA_ARGS__); \\static typeof(name) *_##name = (typeof(name)*)name;  \\static ret name(this, ##__VA_ARGS__)

METHOD定义的函数为静态,文件内部使用时首个参数为私有结构体,如private_linked_list_t。外部通过公共函数访问时,传入的参数为公共结构体,如linked_list_t。使用transparent_union防止编译器报错。

第二部分为函数重定义,在函数名前增加一个下划线;例如get_first与_get_first定义为同一个函数。程序编译时,GCC将优化掉带前缀下划线的定义函数。第三部分为函数定义,之后紧跟函数体。

如下为METHOD宏展开之后的get_first函数定义。

static status_t get_first(union {linked_list_t *_public;private_linked_list_t *this;} __attribute__((transparent_union)),void **item);static typeof(get_first) *_get_first = (typeof(get_first)*)get_first; static status_t get_first(private_linked_list_t *this, void **item)
{if (this->count == 0)return NOT_FOUND;*item = this->first->value;return SUCCESS;
}

METHOD2宏

如下get_source函数使用METHOD2宏定义。

METHOD2(esp_packet_t, packet_t, get_source, host_t*,private_esp_packet_t *this)
{return this->packet->get_source(this->packet);
}

类似于METHOD宏定义,差别在于METHOD2在函数的首个联合体参数中增加了一个公共结构iface2。

/* Same as METHOD(), but is defined for two public interfaces.*/
#define METHOD2(iface1, iface2, name, ret, this, ...) \static ret name(union {iface1 *_public1; iface2 *_public2; this;} \__attribute__((transparent_union)), ##__VA_ARGS__); \static typeof(name) *_##name = (typeof(name)*)name; \static ret name(this, ##__VA_ARGS__)

如下第一个参数联合体,包括两个公共接口结构iface1和iface2,对应于get_source函数的esp_packet_t和packet_t两个参数;以及第三个参数this对应于private_esp_packet_t *this。

union {iface1 *_public1;iface2 *_public2;this;
} __attribute__((transparent_union))

transparent_union属性

transparent_union属性用于修饰联合体定义,使用此联合体作为参数的函数,再被调用的时候被特殊对待。首先,调用者可以使用联合体中的任何一个成员类型作为函数参数,不需要进行强制类型转换。此外,如果联合体中包含(非void)指针类型,则相应的参数也可以是常量NULL指针或void类型指针;如果联合体中包含void指针类型,则相应的参数可以是任何指针类型。如果联合体成员类型是指针,则必须遵守类型上的修饰符(比如const),就像正常的指针转换一样。

其次,传递给函数的透明联合体参数,使用的是透明联合体的第一个成员的调用规约而不是联合体本身的调用规约。联合体的所有成员必须拥有相同的机器表示;这对于传递的参数能正常工作是必须的。

具体参见https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html。

相关文章:

strongswan中METHOD定义

strongswan中使用METHOD来定义函数(方法),如下get_first函数定义。 METHOD(linked_list_t, get_first, status_t,private_linked_list_t *this, void **item) {if (this->count 0)return NOT_FOUND;*item this->first->value;ret…...

Rive 动画框架竟然支持响应式布局,全平台动画框架开启全新 UI 交互能力

没用过 Rive 的可能对于 Rive 还不熟悉,其实之前已经介绍过 Rive 好几次,例如《Rive 2 动画库「完全商业化」》 和《给掘金 Logo 快速添加动画效果》 等文章都介绍过 Rive ,之所以会接触 Rive 到, 也是因为多年前想在 Flutter 平台…...

MQ的详细大全知识点

MQ(Message Queue)是一种在分布式系统中广泛应用的消息中间件,它基于“先进先出”的数据结构原理,用于在不同系统之间传递消息。MQ通过提供接口给各个系统调用,实现了发送者和接收者之间的解耦,使得系统之间…...

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法:图像可以表示为高维空间中的向量。当两个图像相似时,它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度(或余弦相似度)来确定这些向量的相似程度。如果角度小,…...

【tomcat系列漏洞利用】

Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用。主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container…...

前端学习-盒子模型(十八)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 盒子模型组成 边框 语法 边框简写 代码示例 表格的细线边框 语法 内边距 内边距复合写法 外边距 外边距典型应用 外边距合并 清除内外边距 总结 前…...

【C++】类和对象(十二):实现日期类

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的实现日期类&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 /!/>/</>/<运算符重载2 /-//-运算符重载(A) 先写&#xff0c;再通过写(B…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《提升系统频率支撑能力的“车-氢”柔性可控负荷协同构网控制》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

异或的性质

交换两个变量的值&#xff0c;不使用第三个变量。 即a3,b5,交换之后a5,b3; 有两种解法, 一种用算术算法, 一种用^(异或) a a b; b a - b; a a - b; or a a^b;// 只能对int,char… b a^b; a a^b; or a ^ b ^ a; 异或交换两个变量值的方法是利用了异或运算的特性。下面是…...

新一代Webshell管理器

工具介绍 游魂是一个开源的Webshell管理器&#xff0c;提供更为方便的界面和更为简单易用的功能&#xff0c;可配合或代替其他webshell管理器&#xff0c;帮助用户在各类渗透场景中控制目标机器。游魂不仅支持常见的一句话webshell以及常见Webshell管理器的功能&#xff0c;还…...

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…...

windows C#-匿名类型

匿名类型提供了一种方便的方法&#xff0c;可用来将一组只读属性封装到单个对象中&#xff0c;而无需首先显式定义一个类型。 类型名由编译器生成&#xff0c;并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用 new 运算符和对象初始值设定项创建匿名类型。 …...

CryptoHack 简介

CryptoHack 简介 文章目录 CryptoHack 简介一、python的安装&#xff0c;运行二、ASCII码三、十六进制四、Base64五、字节和大整数六、XOR1.基本2.xor属性3.xor隐藏字节4.cryptohack——You either know, XOR you dont 一、python的安装&#xff0c;运行 二、ASCII码 chr()函数…...

transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.

把scene.add(transformControls);改为scene.add(transformControls.getHelper());...

游戏开发与游戏运营:哪个更难?

在探讨游戏产业时&#xff0c;游戏开发和游戏运营是两个至关重要的环节。它们各自承担着不同的职责&#xff0c;共同推动着游戏产品的成功与发展。然而&#xff0c;关于哪个环节更难的问题&#xff0c;并没有一个绝对的答案&#xff0c;因为两者都涉及复杂的流程、专业技能和独…...

大模型在自动化渗透测试中的应用

1. 引言 随着人工智能技术的快速发展&#xff0c;特别是大模型&#xff08;如GPT-3、GPT-4等&#xff09;的出现&#xff0c;自动化渗透测试领域迎来了新的机遇。大模型具有强大的自然语言处理能力和生成能力&#xff0c;能够在多个环节提升渗透测试的效率和准确性。本文将详细…...

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…...

C语言 | Leetcode C语言题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; bool parseComplexNumber(const char * num, int * real, int * image) {char *token strtok(num, "");*real atoi(token);token strtok(NULL, "i");*image atoi(token);return true; };char * complexNumberMulti…...

Vue如何实现数据的双向绑定和局部更新?

1、Vue如何实现数据的双向绑定和局部更新&#xff1f; Vue.js中数据的双向绑定和局部更新可以通过v-model指令来实现。v-model是一个内置的双向数据绑定机制&#xff0c;用于将输入元素&#xff08;如input、textarea、select等&#xff09;与Vue实例的数据进行双向绑定。 在…...

java学习1

一、运算符 1.算术运算符 在代码中&#xff0c;如果有小数参与计算&#xff0c;结果有可能不精确 1-1.隐式转换和强制转换 数字进行运算时&#xff0c;数据类型不一样不能运算&#xff0c;需要转成一样的&#xff0c;才能运算 &#xff08;1&#xff09;隐式转换&#xff1a…...

Flowable工作流实战:手把手教你安全删除运行中的任务(附完整SQL与避坑指南)

Flowable工作流实战&#xff1a;安全删除运行中任务的完整指南 在业务流程管理系统中&#xff0c;Flowable作为一款轻量级的工作流引擎&#xff0c;因其高效的流程执行能力和灵活的扩展性而广受开发者青睐。然而在实际开发过程中&#xff0c;我们难免会遇到需要强制删除运行中任…...

26-cv-2777、26-cv-2964、26-cv-3022、26-cv-3949、26-cv-4062、26-cv-5488 Winnie Rosaline Kan 版权画维权!

案号&#xff1a;26-cv-2777、26-cv-2964、26-cv-3022、26-cv-3949、26-cv-4062、26-cv-5488原告品牌&#xff1a;Winnie Rosaline Kan 版权画品牌方&#xff1a;Casetagram Limited起诉地&#xff1a;美国伊利诺伊州代理律所&#xff1a;Keith起诉时间&#xff1a;2026年03月1…...

UWB定位标签天线怎么选?PATCH、PIFA、DIPOLE三种方案全对比(含NXP/Qorvo模组适配建议)

UWB定位标签天线选型指南&#xff1a;PATCH、PIFA、DIPOLE三大方案深度解析与工程决策 在物联网定位技术领域&#xff0c;超宽带(UWB)凭借其厘米级精度和强抗干扰能力&#xff0c;已成为工业定位、智能仓储和医疗设备追踪的核心解决方案。而天线作为UWB系统的"感官器官&qu…...

ARM TLB机制与虚拟化加速:TLBIP指令与TLBID域深度解析

1. ARM TLB机制与虚拟化加速 在现代ARM架构中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;作为内存管理单元&#xff08;MMU&#xff09;的核心组件&#xff0c;其性能直接影响虚拟地址转换效率。随着虚拟化技术的普及&#xff0c;ARMv8/v9架构引入了…...

基于CircuitPython的嵌入式传感器数据可视化系统设计与实现

1. 项目概述 如果你手头有一块Adafruit CLUE开发板&#xff0c;上面集成了温度、湿度、气压、颜色、加速度计等一大堆传感器&#xff0c;你可能会想&#xff1a;怎么才能最直观地看到这些传感器数据的变化呢&#xff1f;是盯着串口监视器里不断滚动的数字&#xff0c;还是把它们…...

RePKG终极指南:如何深度解析Wallpaper Engine资源包与TEX纹理转换

RePKG终极指南&#xff1a;如何深度解析Wallpaper Engine资源包与TEX纹理转换 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的专业级资源包解…...

仅1月Accepted!恭喜北大学者独作发表Nature子刊(IF 10.1)!

源自风暴统计网&#xff1a;一键统计分析与绘图的AI网站 引言 非协作者且是独作&#xff0c;用GBD 2023发表顶刊Nature是什么概念&#xff1f;来看今天这篇由北大学者发表的硬核文章&#xff01;GBD 2023发文依然很顶&#xff0c;郑老师团队的专属科研训练营帮你实现从0到1的…...

OpenClaw-China:中文场景下开源大语言模型高效微调与部署实战指南

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“BytePioneer-AI/openclaw-china”。光看这个名字&#xff0c;你可能会有点摸不着头脑——“BytePioneer”是字节先锋&#xff0c;“openclaw”是开放之爪&#xff0c;再加上“china”的后缀&#x…...

不想做程序员了,听说网络安全前景好,现在转行还来得及吗?

不想做程序员了&#xff0c;听说网络安全前景好&#xff0c;现在转行还来得及吗&#xff1f; 我去年四月份被裁员&#xff0c;找了两个月工作&#xff0c;面试寥寥无几&#xff0c;就算有也都是外包&#xff0c;而且外包也没面试通过。我经历了挫败&#xff0c;迷茫&#xff0…...

朋友学过都说好的家电清洗培训 行业前景与培训内容科普解读

家电清洗培训行业前景随着人们生活水平的提高&#xff0c;家电的普及率越来越高&#xff0c;对家电清洗的需求也日益增长。据相关数据显示&#xff0c;近年来家电清洗市场规模呈现逐年上升的趋势。在城市中&#xff0c;越来越多的家庭开始重视家电的清洁与保养&#xff0c;以延…...