宏替换编译
⑴ c语言中的“宏”是指什么
是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。
“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
计算机语言如C语言或 汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-C语言中,宏分为有参数和无参数两种。
(1)宏替换编译扩展阅读
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代码调用它们,使用时只需给出这个指令代码就能执行其功能,也可以像调用子程序一样使用。
⑵ 宏替换,宏展开到底分别在什么时候进行
//在宏 使用的时候 分为
宏定义 和 宏展开, 你那个 宏替换就是展开
宏定义是你自己写的 #define
然后展开在预编译时候处理
这个时候编译器先扫描一遍文件 把用到宏的地方都做字符替换
比如
#define M 1
int a = M;
那么预编译的时候就把 M 替换成1
注意宏只做文本替换,所以
比如 #define MUL(__x__, __y__) __x__ * __y__
int a = MUL(a + b, c+ d);
会被替换成 int a = a + b * c + d // 可能就会和初衷违背(如果你想做的是 (a + b) * (c + b))
从展开的角度来说 因为宏是可以嵌套的 所以宏在替换的时候 我们叫做展开
比如 做一个函数参数声明
#define PARAMS_SET_1(__type__, __name__) __type__ __name__
#define PARAMS_SET_2(__type__, __name__) __type__ __name__##1, __type__ __name__##2
//... 定义N个 PARAMS_SET_N
#define PARAMS(__size__, __type__, __name__) PARAMS_SET_##__size__(__type__, __name__)
然后 定义函数
int foo(PARAMS(2, int, n));
那么预编译的时候宏会这样展开
1, int foo(PARAMS_SET_2(int, n));
2, int foo(int n1, int n2);
另外注意就是编程的时候 由于宏只是文本替换,缺少类型检测 以及运算顺序这样的功能,所以要少用宏
上面所有的宏都有替换的方案
#define M 1 替换方案
struct M
{enum {value = 1} };
int a = M::value;
#define MUL(__x__, __y__) __x__ * __y__ 替换方案
template<int x, int y>
struct MUL
{enum{value = x * y}};
int a = MUL<10 + 20, 10 + 30>::value;
最后一个PARAMS的替换方案就是函数重载
template<typename T>
int foo(T n1);
template<typename T>
int foo(T n1, Tn2);
//后面定义N个
⑶ C语言的编译系统对宏命令的处理
前言:宏实质就是编译器在对代码进行编译之前进行的一个“查找替换”工作,就跟你在处理文档时用WPS/WORD/记事本等进行“查找替换”操作一样。
C语言的编译系统对宏命令的处理是()
A。在程序运行时进行的
B。在对源程序中其他成分正式编译之前进行的
C。在程序连续时进行的
D。和C程序中的其他语句同时进行编译
答:选B。在对源程序中其他成分正式编译之前进行的
2,
#defineN2/*在预编译时将用下面代码中N替换成2*/
#defineMN+1/*在预编译时将M替换成N+1(即2+1,N会再被替换成2)*/
#defineNUM2*M+1/*如上:在预编译时NUM替换成2*M+1,即2*N+1+1,即2*2+1+1*/
main()
{inti;
for(i=1;i<=NUM;i++)printf("%d\n",i);
/*
*如上所述,上句展开为:for(i=1;i<=2*2+1+1;i++)printf("%d\n",i);
*所以:循环将执行6次
*/
}
/*切记注意:每一个宏百进行替换时只是替换“正文”中的内容,而不包括预编译语句的内容,否则就会像不少人理解的那样,错误地认为第2个题中的循环将执行7次*/