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

C语言奇技淫巧之--用宏定义替换函数名的另外一种思路

时间有限,简要记录原理。
快速回忆要点:

#if definde(FEATURE_A)
#define myfunc _myfunc
#endif
int myfunc(int a, int b) 

场景:
假设某个功能函数针对不同的makefile配置需要有不同的函数名字,通常做法如下:

#if definde(FEATURE_A)
int myfunc(int a, int b) 
#else
int _myfunc(int a, int b)
#endif
{
...
return 0;
}

奇技淫巧的做法是,灵活利用C语言编译预处理,在预处理阶段就进行了替换,从而避免了某个函数各种名字的方式,不过这种类型仅限于微改变函数参数仅仅改变函数名字的场景。

#if definde(FEATURE_A)
#define myfunc _myfunc
#endif
int myfunc(int a, int b) {
...
return 0;
}

上面的代码有点绕,要动态的来看,在编译预处理阶段将myfunc函数替换为_myfunc,那么通过-i参数假设看生成的预处理后的文件就会看到只有_myfunc,没有myfunc了。然后编译就只剩下_myfunc函数名字了,但是代码里面却可以依旧使用myfunc

什么场景需要用的这种工程方式呢?比如在内核模块中需要和其他模块避免相同的函数名字,什么场景有这种需求呢?比如内核有个kunit模块,然后我们自己实现了一个kunit接口类似的模块,如果内核加载了这个模块,自己的模块就需要都把函数替换一遍,优雅地做法就是上面的方式。

结论:

  • 灵活使用编译流程尤其是宏定义有很多帮助
  • 掌握底层逻辑尤其是一些元操作能够对一些工程问题有一些不错的解决方式
  • 优雅的做事

相关文章:

  • Android 属性动画及自定义3D旋转动画
  • C语言什么是指针? 什么是指针变量?
  • C++之STL整理(8)之stack用法(创建、赋值、增删查改)详解
  • 【Android】【root remount】【2】如何判断设备是否remount
  • 接口自动化测试(python+pytest+requests)
  • 工业视觉AI应用总结记录
  • AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火
  • String类(1)
  • 动手学习深度学习(李沐)
  • Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)
  • 前端使用minio传输文件
  • Java Set基础篇
  • Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程
  • 在unbuntu服务器上使用nginx+uwsgi部署django项目
  • 领鸡蛋游戏养鸡游戏淘宝客源码广告联盟
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 30天自制操作系统-2
  • docker容器内的网络抓包
  • eclipse(luna)创建web工程
  • export和import的用法总结
  • httpie使用详解
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • LeetCode29.两数相除 JavaScript
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • Spring核心 Bean的高级装配
  • Vue--数据传输
  • 闭包,sync使用细节
  • 前嗅ForeSpider采集配置界面介绍
  • 通过git安装npm私有模块
  • 找一份好的前端工作,起点很重要
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​渐进式Web应用PWA的未来
  • ​用户画像从0到100的构建思路
  • #单片机(TB6600驱动42步进电机)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)构建dubbo分布式平台-平台功能导图
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • *p++,*(p++),*++p,(*p)++区别?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 中插件式开发实现
  • .net Stream篇(六)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net组件程序设计之线程、并发管理(一)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ??javascript里的变量问题
  • @NestedConfigurationProperty 注解用法
  • @RequestMapping用法详解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945