c/c++的宏的一些规则

C/C++宏替换实现详解 基本形式 #define name replacement_text 通常情况下,#define 指令占一行,替换文本是 define 指令行尾部的所有剩余部分,但也可以把一个较长的宏定义分成若干行,这时需要在待续的行末尾加上一个反斜杠符 “。 宏定义也可以带参数,这样可以对不同的宏调用使用不同的替换文本。例: #define max(A, B) ((A) > (B) ? (A) : (B)) 宏展开中的陷阱 仔细考虑一下 max 的展开式,其中的表达式会被计算两次,因此如果表达式中包含自增运算符或输入/输出等行为,则会出现不正确的情况,例如上述的宏 max: max(i++, 立即下载
1.#和##
   #符号把一个符号直接转换为字符串,例如:
   #define STRING(x) #x
   const char *str = STRING( test_string ); str的内容就是"test_string",也就是说#会把其后的符号
   直接加上双引号。
   ##符号会连接两个符号,从而产生新的符号(词法层次),例如:
   #define SIGN( x ) INT_##x

   int SIGN( 1 ); 宏被展开后将成为:int INT_1;


2.变参宏
   #define LOG( format, ... ) printf( format, __VA_ARGS__ )
   LOG( "%s %d", str, count );
   __VA_ARGS__是系统预定义宏,被自动替换为参数列表。


3.宏参数的prescan,
   当一个宏参数被放进宏体时,这个宏参数会首先被全部展开(有例外,见下文)。当展开后的宏参数被放进宏体时,
   预处理器对新展开的宏体进行第二次扫描,并继续展开。例如:
   #define PARAM( x ) x
   #define ADDPARAM( x ) INT_##x
   PARAM( ADDPARAM( 1 ) );
   因为ADDPARAM( 1 ) 是作为PARAM的宏参数,所以先将ADDPARAM( 1 )展开为INT_1,然后再将INT_1放进PARAM。
  
   例外情况是,如果PARAM宏里对宏参数使用了#或##,那么宏参数不会被展开:
   #define PARAM( x ) #x
   #define ADDPARAM( x ) INT_##x
   PARAM( ADDPARAM( 1 ) ); 将被展开为"ADDPARAM( 1 )"。

   使用这么一个规则,可以创建一个很有趣的技术:打印出一个宏被展开后的样子,这样可以方便你分析代码:
   #define TO_STRING( x ) TO_STRING1( x )
   #define TO_STRING1( x ) #x
   TO_STRING首先会将x全部展开(如果x也是一个宏的话),然后再传给TO_STRING1转换为字符串,现在你可以这样:
   const char *str = TO_STRING( PARAM( ADDPARAM( 1 ) ) );去一探PARAM展开后的样子。

4.__FILE__, __LINE__

当前文件和行数

Adams中AKISPL和DX函数的妙用:打造精准的非线性衬套模型 本文深入探讨了在Adams动力学软件中,如何巧妙运用AKISPL插值函数与DX等位移测量函数,构建高精度的非线性衬套模型。文章通过实战案例,详细解析了从单轴非线性刚度到完整六自由度耦合模型的实现步骤与调试技巧,帮助工程师将复杂的实验或有限元数据转化为可靠的多体动力学仿真模型,有效提升系统仿真置信度。 阅读详情

相关推荐

python sci sci-hub 爬论文

sci-hub 爬虫 后续加入对于时间的排序,下载最新文献 参考: https://www.guanjihuan.com/archives/6846 https://blog.youkuaiyun.com/czh2637750821/article/details/115508922

weixin_42783619的博客 3542

宏 # ## C++

<br />#include<iostream> #include<string> using namespace std; #define STRING(X) #X int main() { string str = STRING(Hello World !); cout<<str<<endl; cout<<&STRING(Hello World !)<<endl; string pstr; cout<<&pstr<<endl; pstr=STRING(Hello Wor

I&U 533

电路课设-音响分频器电路设计

(一)题目简介 1.一阶分频器电路设计 假定高音和低音扬声器均等效为 16 欧姆电阻,设计如图 2 的简单分频器电 路,要求高低频分界(两个滤波器的截止频率)为 5kHz。 1) 写出高音扬声器和低音扬声器电压对于 vs 的传递函数,确定电路中电 容 C 和电感 L 的元件值;2)利用 AC 频率扫描分析求出两个扬声器电压的频率响应曲线,验证计算 结果。用包含高低频成分的电压 vs 激励进行测量验证。 3)计算并利用 EWB 仿真证明从 vs 看进去的阻抗为一常数 16 欧姆。

weixin_53507617的博客 1万+

C语言常见命名规范

C语言常见命名规范 目录C语言常见命名规范一、常见命名规则1、匈牙利命名法2、骆驼(Camel)命名法3、帕斯卡(Pascal)命名法。4、下划线命名法。二、函数的命名三、变量的命名四、常量及宏的命名五、常用缩写词 文章转载:https://www.cnblogs.com/liujiahi/archive/2011/09/16/2196348.html 一、常见命名规则 1、匈牙利命名法   这...

weixin_42813232的博客 5385

手把手教你用STM32F103C8T6驱动HUB75 LED点阵屏(附74HC595级联代码)

本文详细介绍了如何使用STM32F103C8T6开发板驱动HUB75接口的LED点阵屏,包括硬件连接、74HC595级联代码、时序控制及灰度显示实现。通过实战案例展示动态文字显示和性能优化技巧,帮助开发者快速掌握LED点阵屏驱动技术。

weixin_42623010的博客 342

中国区ASP服务性规范考试

10、每次现场维护服务,工程师需按照400要求达到现场的时间与客户联系,在抵达现场、故障恢复后两个时间点分别向400报CALL ,如与客户联系变更到现场时间点,也需向400电话备案(400-822-9999)……20、工程师小B 在接到客户故障申报后赶到客户现场,发现问题无法解决,于是及时将情况反馈至技术支持响应工程师小C ,小B 就和小C 协商由小C 远程解决此问题,后小B 离开客户现场。18、小L 到客户现场交付安装服务。6、EPMS 中上载初验证书的命名规则为:合同号+初验的客户签署日期……

2301_76197693的博客 1909

C++中的宏替换

1.引子 #define cat(x, y) x ## y 那么cat(a, b)和cat(cat(a, b), c)的结果是啥. #define str_impl(x) #x #define str(x) str_impl(x) 的意图何在. 2.规则 宏替换是C/C++的预处理中的一部分,在C++标准中有4条规则来定义替换. 规则1:实参替换. 本条规则描述带参数的宏的替换过

baihacker的专栏 9041

LightGBM参数调优实战:从基础到高级技巧

本文深入探讨了LightGBM参数调优的实战技巧。文章从理解其Leaf-wise生长策略的核心逻辑出发,系统性地介绍了分层调参策略:首先调整控制模型结构的参数(如num_leaves),其次优化学习能力参数(如learning_rate),最后通过正则化与随机化参数提升泛化能力。文中还提供了从建立基线到最终微调的完整实战流程与高级避坑指南,帮助读者高效提升模型性能。

i8j9k0l1的博客 262

c++实现正则表达式匹配

c++11之后封装了自己的正则表达式,直接包含文件即可使用,利用regex类声明对象初始化正则表达式,regex expressionName (“正则表达式”);正则表达式具体语法参考这里;regex_match()方法进行匹配,匹配成功返回1,失败返回0;cmatch和smatch类分别存放char*和string类型的结果,遍历即可获得;// regex_match example #incl

bwangk的博客 1万+

iqoo11如何获取root权限?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 5827

13、基于RBF的自适应鲁棒控制与反步控制方法及实现

本文介绍了基于RBF神经网络的自适应鲁棒控制与反步控制方法,详细阐述了控制系统的程序结构、核心算法及实现流程。通过Simulink搭建仿真系统,利用RBF网络逼近系统中的不确定非线性函数,并结合Lyapunov稳定性理论设计控制律,实现了对倒立摆等复杂非线性系统的高精度跟踪控制。文章还提供了完整的MATLAB/Simulink代码示例和仿真结果分析,验证了该方法的有效性与鲁棒性,为实际工程应用提供了可行的技术路径。

ol789012的博客 88

C++中宏替换原则

C++中的宏替换 转自:http://blog.youkuaiyun.com/baihacker/article/details/9204419 1.引子 #define cat(x, y) x ## y 那么cat(a, b)和cat(cat(a, b), c)的结果是啥. #define str_impl(x) #x #define str(x) str_impl(x)

LGD_2008的专栏 1670

Linux V3H 平台开发系列讲解(串行解串篇)2.2.2 MAX9296 MAX96705 GMSL1 续篇--串行器提前配置

本文详细介绍了在Linux v3h平台上,针对Max9296解串器和解串器max96705的详解配置,验证可出图,内容包括串行器解串器介绍、链路框架、硬件连接、速率配置,以及遇到的图像异常问题及解决方法。

xian18809311584的博客 539

C/C++语言中头文件的保护宏

保护宏就是C/C++头文件开始处的宏判断和宏定义,可以避免该头文件被多次加载执行而导致编译错误的宏。

zzfenglin的博客 8979

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

你所不知道的 C/C++ 宏知识——基于《C/C++ 宏编程的艺术》

现在焦点就集中在 PP_COMMA_IF 宏的实现上了,它根据 n 的值,决定输出 PP_COMMA(),还是 PP_EMPTY(),这之前那一堆宏都是为了实现 PP_IF,看不懂也没关系。复杂的如 PP_WHILE->PP_ADD/PP_SUB->PP_MUL->PP_EQUAL/PP_CMP->PP_LESS->PP_DIV/PP_MOD,就没画了,主要是没看懂~

weixin_55010563的博客 625

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c语言 macro,C/C++中宏/Macro的深入讲解

前言宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分。C/C++ 代码编译过程 - 图片来自 ntu.edu.sg根据用法的不同,分两种,Object-like 和 Function-like。前者用于 Object 对象,后者用于函数方法。C/C++ 代码编译过程中,可通过相应参数来获取到各编...

weixin_36180611的博客 1654

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何定义函数式宏

众所周知,宏扩展是纯粹的文本扩展,若定义不明确,就会导致结果错误,或者编译错误,尤其是定义函数式宏时,下面有三条规则可以使我们避免出错。          规则1:宏体必须使用括号包起来,以便保护表达式中低优先级的操作符。                    例:                             #define square(x)x*x              

zhangzhi123456789的专栏 1698

C/C++ 中的宏 (macros) 与宏展开的可视化显示

C/C++ 中的宏 (macros) 与宏展开的可视化显示

程永强 4443

笔试面试中C/C++重要知识点整理(不定期更新)

1.  C和C++语言中的优先级规则 C语言中语言声明的优先级规则如下(以后分析的基础): A 声明从它的第一个名字开始读取,然后按照优先级顺序依次读取 B  优先级从高到低依次是                 B. 1 声明中被括号括起来的那部分                 B. 2 后缀操作符:                        括号()表示这是一个函数

菜根 3737

C和C++相互调用规则

无法直接调用原因:C 和 C++ 的函数可以相互调用,但需要一些特殊的注意事项,因为它们有不同的编译和链接规则以及一些语法差异。链接规则:C 语言的链接器通常使用 C 标准的函数命名和调用约定,而 C++ 链接器使用 C++ 的函数命名和调用约定。这意味着 C++ 可以支持函数重载和运算符重载,而 C 不能。如果你要在 C++ 中调用 C 函数,需要使用 extern "C" 块将 C 函数声明包裹起来,以告诉 C++ 编译器使用 C 的链接规则。

chenliang0224的专栏 295

C/C++ 宏详解

http://demonstyle.blog.163.com/blog/static/13143429020091010112159/ C/C++ 宏详解ic/c++ 2009-11-10 01:12:15 阅读18 评论0 字号:大中小 众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的作用,就是自动为我们产生代码。如

carl2380的专栏 518

C++05(内联函数、C/C++的相互调用)

内联函数1.inline内联函数1.1inline函数和宏有什么区别?1.2inline函数和static修饰的函数有什么区别1.3为什么不把所有函数默认处理成inline1.4内联的限制2. 1.inline内联函数 inline关键字加上:不生成符号定义了 inline:编译阶段 调用点---->直接代码展开 1.1inline函数和宏有什么区别? 1.inline函数在编译阶段处理:有类型检查和安全检查,安全 2.宏:在与便于阶段,直接文本替换,不安全 内联函数可以理解为:更安全的宏 1.2in

麦克斯韦小迷妹儿~的博客 583

【C/C++】让你对预处理更加了解!

该篇博客主要讲了程序预处理阶段的知识,详细简绍了有关预处理阶段的知识,可以帮助大家学到更多相关的知识。写的不好希望各位大佬多多指教。

m0_52094687的博客 1846

#define宏的妙用!实现你以为的函数offsetof等

此文章带你认识宏,并且带你感受宏的魅力,宏实现功能等

Lizhihao_的博客 1996

内联函数与宏--小结

第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销...

174
上一篇: LDA在短文本(twiter)应用
下一篇: Dirichlet Process-非参数贝叶斯(1)
windows2
博客等级 码龄18年 18粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值