宏展开的小技巧

Keil C语言编程小技巧:如何避免‘function definition is not allowed here‘错误? 本文深入解析Keil C语言编程中常见的'function definition is not allowed here'错误,提供五大典型场景的解决方案与最佳实践。从嵌套函数定义到头文件组织,结合Keil环境特性,帮助开发者规避编译错误,提升代码质量与开发效率。 阅读详情

    在阅读一些开源代码的时候,经常会看到一个宏定义动辄上百行,而且宏定义还层层嵌套,这对我们理解源代码的难度有点大。昨天一个同学问我有没有好的办法,想了一下这个问题,觉得有点思路,拿出来和大家分享一下。

    我们知道gcc在编译的过程中,依次进行:预处理,编译,汇编,链接。在每个过程中gcc会调用对应的工具,例如对于预处理,gcc会调用cpp,即c语言预处理器。具体的选项为-E。

    而宏定义的展开就是在预处理的过程中处理的,所以思路就是:将调用宏的那部分代码单独提取出来,使用:

    gcc -E file_name.c

    就可以将宏展开,这样看起来就不是很费劲了。

本文出自 “相信并热爱着” 博客,转载请与作者联系!

JetBrains IDE中Rust插件安装与配置:从入门到精通 本文详细介绍了在JetBrains IDE中安装与配置Rust插件的完整流程,从准备工作到高级功能使用技巧。涵盖插件安装、工具链配置、项目创建、调试方法以及常见问题解决方案,帮助开发者高效进行Rust开发。特别适合使用IntelliJ IDEA、PyCharm等JetBrains系列IDE的Rust初学者和进阶用户。 阅读详情

相关推荐

大机汇编宏代码展开

The expandmacro_ply.exe is a command on Windows written by Python(then convert to exe), which can expand the HLASM macro statement and can show the steps it be expanded. What can you do by it? 1.Learn how does one macro be expanded by specifed parameter --debug=true. 2. Show the expansion or compare the result given different parameters for one macro. Get the help information without parameter. C:\Users\mzhai>expandmacro_ply.exe usage: expandmacro_ply --maclib= path of maclib. First of all, You'd better download all macros in SYS1.MACLIB on one LPAR. --call= CALL_MACRO_STRING --sysndx=1 SYSNDX's value --debug=False if debug==true, more comment given eg: expandmacro_ply.exe --maclib=d:/test/sysmac23 --call=" CALL BINAALG" --sysndx=3 --debug=true Show the expansion. C:\Users\mzhai>EXPANDMACRO_PLY --maclib=d:/test/sysmac23 --call=" CPOOL BUILD,PCELLCT=10,SCELLCT=20,CSIZE=40,SP=2 +++++++++++++++++++++++++++++++++ BAS 1,*+48 .BRANCH AROUND PARAMETER LIST DC AL4(10) .PRIMARY CELL COUNT DC AL4(20) .SECONDARY CELL COUNT DC AL4(40) .CELL SIZE DC AL1(2) .SUBPOOL ID DC AL1(0) .KEY DC BL2'0000000000000000' .FLAGS DC AL4(0) .TCB ADDRESS DC XL24'00' .HEADER ESAR 15 .SAVE SECONDARY ASN STM 15,12,16(13) .SAVE REGISTERS L 15,16(0,0) .CVT ADDRESS L 15,772(,15) .ADDRESS SYSTEM LINKAGE TABLE L 15,76(,15) .OBTAIN PC NUMBER PC 0(15) .PC TO IGVCPBDP L 2,16(0,13) .RESTORE SECONDARY ASN SSAR 2

C语言的宏定义、宏展开

①一个较长的宏定义可以分成若干行,这需要在待续的行末尾加上一个反斜杠符”\” #defineTUP_ASSERT(__expression)do {\ if (!( __expression )) \ { \ SYSLOG_LEGACY(EAaSysLogSeverityLevel_Error,"<TUP ASSERTION FAILED> (%s) file: %s line:%u", #__expression,__FILE...

c2737647040的博客 6215

AlertManager的使用(邮件和微信告警)

一、AlertManager概述 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertman

weixin_45880055的博客 2万+

宏定义中,#/##的区别以及宏的展开

1、关于符号#和## #define f(a,b) a##b #define g(a)  #a #define h(a) g(a) #  将右边的参数做整体的字符串替换,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。 g(hello world) =  “hello world”;  g(sleep(1)) = “sleep(1)” g(f(1,2

fendouzhe的专栏 4648

Android P HAL层添加HIDL实例(详细实现步骤)

Android P HAL层添加HIDL实例 本文将介绍如何在P OS上添加HIDL实例,简单增加seLinux策略使得可以在system_service调用测试,并用模拟器emulator验证。 调用过程为 APP->TestManager->TestService->ITast.hal 文章目录Android P HAL层添加HIDL实例实现过程一 、hardware部分1...

sinat_18179367的博客 1万+

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2066

宏展开

在c标准库中,d的实现中,有这样一段代码:#define _STR(x) _VAL(x) #define _VAL(x) #x刚看到时觉得这段代码不就相当于:#define _STR(x) #x后来发现自己理解错了,现对其进行说明。 1、宏定义中使用的#、##、\ #:将其后边的宏参数进行字符串化操作。 ##:连接符,用来将2个token连接为一个token,即将宏定义的2个形参连接为一

夕阳箫鼓 1968

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

C语言之宏定义用法总结

常用的宏定义总结

weixin_42666900的博客 5250

yolo 图像检测、关键点检测单摄像头测量物体尺寸长度大小

new_distance/real_size (待求物体像素距离与实际距离比值)= distance / metric_length (参照物像素距离与实际距离比值)然后运行size_demo进行要测量的物体进行关节点检测距离;metric_length是上面耳机选取的两个点的实际物理距离,大概6cm;这里用的windows。通过关键点检测识别物体关键点的像素距离,然后参考比例尺计算实际距离。2)关键点算法这里用的现有的进行测试,实际场景需要自己训练。这里拿这模型推理出的关键点坐标进行后续长度计算。

weixin_42357472的博客 2525

【人工智能】RAG如何根据实际需求选择和进行文档解析(如 PDF、Word、TXT、网页等)?

文档解析的核心在于根据解析目标、文档类型和处理量选择合适工具。PDF、Word、TXT和网页各有特性:PDF需区分可编辑与扫描版,Word需处理结构化内容,TXT简单但需注意编码,网页需应对动态内容。解析场景包括提取纯文本、结构化数据、保留格式和批量处理。非技术用户可借助工具如Adobe Acrobat、WPS和在线OCR,技术用户可通过编程实现自动化。通用流程为:明确目标、分析文档属性、选择工具并测试优化。核心是“工具适配需求”,无需追求万能方案。

奶爸的编程之路,也就一周冷个三天 506

C技巧:结构体参数转成不定参数

下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“__VA_ARGS__”,下面这段程序可以在GCC下正常编译通过: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include   #def

Never too late to study 1397

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1342

一.宏定义(3) --查看宏展开

1.     怎么查看宏展开          从一个宏定义开始说起 #define Mul( a,b) a * b       乍看之下这个宏定义并没有什么问题,但是当你采用如下用法的时候就会出现问题了 int main(char * argv[] ,intargc) { intnmul=Mul(2+3, 4+5); printf("mul=[%d]

糙级码lee的专栏 1万+

博途PLC PID仿真LSim_PT1库算法(一阶系统差分方程推导全过程)

博途PLC的PID仿真可以参看下面这篇博客,这篇文章我们主要论坛仿真库LSim的算法由来。如何利用博途PLC PID_Compact 进行PID仿真(一阶系统)_RXXW_Dor的博客-优快云博客博途PLC PID控制器 PID_Compact FB如何使用可以参看下面这篇文章,这里不再赘述。

RXXW_Dor的博客 2858

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

vc几个小技巧

1. 查看宏展开代码。      写一些复杂的宏,经常出现一些莫名其妙的错误,如何查看展开的代码呢。    cpp/c文件上右键属性   【c/c++   \  Preprocessor \ Generate Preporcessed File】 选择/p参数, 再右键编译这个文件,则会在工程目录下生成 .i文件 2. 找不到pch文件的     这个基本都是用了预编译头文件,但是

u014409795的专栏 480

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C语言编程小技巧:如何避免Keil中的函数定义错误

本文深入解析了在Keil MDK环境下编译C语言程序时常见的“function definition is not allowed here”错误。文章从C语言函数定义的基本规则出发,详细拆解了头文件陷阱、大括号不匹配、宏展开意外、结构体误解及条件编译混淆五大常见“雷区”,并提供了具体的规避方案与正确代码示例。同时,文章分享了构建健壮代码的编程习惯与Keil工程配置的排查流程,帮助嵌入式开发者从根本上杜绝此类错误,提升代码质量与编译效率。

weixin_29185199的博客 101

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Keil C语言编程小技巧:如何避免函数定义位置错误导致的编译失败

本文针对Keil C语言编程中常见的“function definition is not allowed here”编译错误,深入剖析其根源在于函数定义位置违反了C语言语法规则。文章提供了避免在头文件中混淆声明与定义、检查大括号匹配、谨慎使用宏以及正确组织代码结构等实用技巧,帮助开发者从根本上规避此类问题,提升代码的规范性和可维护性。

honey的博客 361

【C语言笔记】【小技巧系列】 条件表达式省略中间的操作数

【C语言笔记】【小技巧系列】 条件表达式省略中间的操作数 在平时阅读代码时,有时候会看到代码中将条件表达式(conditional expression)中间的操作数(operand)省略的情况,例如下面的linux内核代码/drivers/usb/storage/transport.c中的一段代码: /* wait for the completion of the URB */ timeleft = wait_for_completion_interruptible_timeout( &amp

703

勿在浮沙筑高台:关于宏定义的几个小技巧

大道不过三俩行,说破不值一文钱~~ 假如有过C++应用程序开发的经历,相信很多时候经常会遇到一些莫名其妙的宏定义,宏展开之类的~~ 其实用法很简单,一旦说破就什么都没了,只是经常让人疑惑,为什么要用宏定义,直接写不好么? 答案是但凡是用宏定义的地方都可以用正常写法完成,但是又是宏定义会带来很多不一样的神奇的化学反应~ 技巧一: 使用宏定义代替现有类型,有助于跨平台 #defin

qq_30168505的博客 1161

Rustic LSP配置全攻略:轻松集成rust-analyzer实现智能代码补全

想要在Emacs中获得专业的Rust开发体验吗?Rustic为你提供了完整的LSP配置方案,让你轻松集成rust-analyzer,享受智能代码补全、实时错误检查和代码导航等功能。本文将为你详细介绍如何在Rustic中配置LSP,选择适合你的客户端,并解决常见问题。 ## 🚀 为什么选择Rustic的LSP集成? Rustic基于rust-mode构建,提供了强大的语言服务器协议支持。通过L

gitblog_00757的博客 420

【Perforce】Helix QAC-预处理代码生成与问题诊断实战指南

本文详细介绍了Helix QAC预处理代码生成功能的实战应用。通过生成.c.i和.c.qac.via文件,完整记录代码分析时的宏展开、头文件内容及配置信息,有效解决跨环境分析结果不一致、规则误报难以复现等协作难题,是提升嵌入式C/C++代码静态分析效率和精度的关键工具。

u9v0w的博客 586

GDB调试技巧:调试复杂的宏定义

C语言 中的宏定义,有着各种各样的好处和坏处,可谓让人有爱有恨。在大型的工程项目中,为了简洁,为了封装,宏的应用必不可少。但是在调试问题时,因为宏定义是 被预定义处理的,所以不会有任何的编译符号和调试信息。这样给调试宏定义时,带来了很大的困难。对于开发人员来说,除了直接肉眼去看宏定义,自己来展开宏 定义去确定问题,是否还有其它手段来调试宏定义吗? 本文介绍两种调试宏定义的小技巧: 第一个方法是

zhanglp的专栏 1192
上一篇: wc命令
下一篇: tail命令和head命令
下木
博客等级 码龄16年 88粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值