带参数的宏替换

带参数的宏替换因各种需求叠加,替换规则很怪异:

1、首先将实参替换形参,并展开宏

2、如果1步展开后,有#或者##,那么停止替换。

3、如果1步展开后,没有#或者##,且参数也是宏,那么继续替换,知道参数没有宏为止。

4、执行完1-3后,第一轮替换结束,再次扫描宏,如果外层还有宏,继续替换。

5、简单说:先用实参代替形参,然后继续替换实参内的宏,发现#或##后停止。

原文地址:https://www.cnblogs.com/litifeng/p/8424078.html

时间: 2024-07-30 14:12:58

带参数的宏替换的相关文章

不带参数的宏定义与带参数的宏定义

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义.文件包含.条件编译 1.不带参数的宏定义: 宏定义又称为宏代换.宏替换,简称“宏”. 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”. 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串. 掌握"宏"概念的关键是“换”.一切以换为前提.做任何事情之前先要换,准确理解之前就要“换”. 即在对相关命令或语句的含义和功能作具体分析之前就要换: 例: #define PI 3.1415

C语言:带参数的宏定义

宏名的命名规范 1.全部大写有多个单词中间使用下划线隔开(常用) 2.以k开头的驼峰标识(不常用) 带参数的宏定义:把出现宏名地方都会把宏名后面小括号中的参数代入到宏后面的表达式中,然后进行替换 格式:#define 宏名(参数列表)  表达式 注意点:1.参数列表中没有类型 2.宏名与括号之间一定不要加空格 带参数的宏与函数的区别 1.函数有一个调用过程,会开辟新存储空间,需要花费一些开销的 2.宏仅仅是做一个替换的操作 使用场景: 1.当计算比较简单,参数比较少的时候使用宏,宏提高运算效率

C语言中带参数的宏

带参数的宏定义有如下的格式: [#define 指令----带参数的宏] #define 标识符(x1,x2,……,xn) 其中  x1,x2,……xn是标志符(宏的参数) 注意:在宏的名字和括号之间必修没有空格. 如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分 当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用.在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器

c语言之带参数的宏定义

1.带参数的宏定义中,宏名和新参表之间不能有空格, 2.在带参数的宏定义中,形参参数不分配内存单元,因此不必作类型定义.而宏调用中的实参有具体值,要用它去代换形参,因此必须作类型说明. #include<stdio.h> #include<iostream> #define MAX(a,b) (a>b)?a:b int main() { int x, y, max; x = 2; y = 3; max = MAX(x,y); printf("%d\n",

编程题:带参数的宏定义来实现,求圆的周长和面积。

#include<stdio.h> #define PI 3.14159 #define L(r) 2*PI*(r) #define S(r) PI*(r)*(r) void main() { float radius,circle,area; scanf("%f",&radius); circle=L(radius); area=S(radius); printf("radius:%f\tcircle:%f\tarea:%f\n", radiu

批处理命令:带参数的字符串替换

批处理命令:带参数的字符串替换 @echo off setlocal enabledelayedexpansion set main_str=hello world set src=hello set dst=hi echo %main_str% set sub_str=!main_str:%src%=%dst%! echo %sub_str%

sas宏(3)宏,调试宏,创建带参数的宏,理解符号表(全局宏与局部宏解析),宏条件运算符,在宏中进行运算

宏类似于c中的函数,传入指定参数后执行,并且宏内部可以包含data步程序和条件运算符号. 宏变量只是小小的变量....(by the way作用也很大) 1:宏的基本语法 如何创建一个简单的宏并使用? %macro prtlast; proc print data=&syslast (obs=5); title "Listing of &syslast data set"; run; %mend; %prtlast /*不要加分号,加了有可能出错*/ 宏创建过程中做了什

C语言带参数的宏

利用带参数的宏,可以加强封装,简化主体代码.(VC6控制台工程) 1 // 带参数的宏.cpp 2 // 看看带参数的宏是怎么玩的 3 4 //#include "stdafx.h" 注释掉这个头文件,同时在Project——setting——precompiled headers——选择“Not Use Precompiled Header”,能够避免compile出错 5 #include "stdio.h" 6 7 #define prt(cmd) (prin

C语言可变参数在宏定义中的应用

在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)