① c语言中的“宏”是指什么
是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。
“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
计算机语言如C语言或 汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-C语言中,宏分为有参数和无参数两种。
(1)c语言宏的替换体可以有空格吗扩展阅读
A类宏是用G65 Hxx P#xx Q#xx R#xx或G65
Hxx P#xx Qxx
Rxx格式输入的,xx的意思就是数值,是以um级的量输入的,比如你输入100那就是0.1MM #xx就是变量号,变量号就是把数值代入到一个固定的地址中,固定的地址就是变量。
一般OTD系有#0~#100~#149~#500~#531.关闭电源时变量#100~#149被初始化成“空”,而变量#500~#531保持数据。我们如果说#100=30那么现在#100地址内的数据就是30了。
B类宏能完成某一功能的一系列指令像子程序那样存入存储器,用户可以设定M、S、T、G代码调用它们,使用时只需给出这个指令代码就能执行其功能,也可以像调用子程序一样使用。
② c语言带参宏替换的参数是形参还是实参
所谓形参和实参,是指的在函数调用时,为函数参数分配的临时变量,称为实参。而函数定义时使用的变量名,本身并不具有内存,称为形参。
也就是说,实参和形参都是针对函数来说的。对于宏,即使是带参数的宏,也不能称为形参和实参。
宏的调用,本身就是一种简单的替换,替换的部分,甚至本身并不是一个变量或者表达式,而只是一个变量的一部分。并不具备运行特征,即内存的分配和释放。
宏的展开是在编译前,即所谓的预编译阶段就完成了,而形参实参的转换,是在运行阶段完成的。
③ C语言的宏展开,讲一下什么是宏展开,怎么实现
对于C++宏展开,先说一点:
#define功能将源程序文件中出现的对宏的引用展开成相应的宏 定义,由预处理器来完成。经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作的确只是纯粹的替换与展开,没有任何计算功能。
对于“带参数的宏替换”,可以由下列代码尝试理解下
#include <stdio.h> #define min(x,y) ({ typeof(x) _x = (x);typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; }) //防止x和y为一个表达式和失去了类型检测功能;
#define min_replace(x,y) ({ x < y ? x : y; })
void main()
{
int x=1;
int y=2;
int result = min(x++,y);
printf("没有替换时的运行结果为:%d\n",result);
int x1=1;
int y1=2;
int result1 = min_replace(x1++,y1);
printf("替换之后的运行结果为:%d\n",result1);
return ;
}
需要注意:
宏名和参数表的括号间不能有空格。
宏替换只做替换,不做计算和表达式求解,这一点要格外注意。
函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。
宏的哑实结合(哑实结合类似于函数调用过程中实参替代形参的过程)不存在类型,也没有类型转换。
宏展开使源程序变长,而函数调用则不会。