当前位置:首页 » 编程软件 » 宏替换编译

宏替换编译

发布时间: 2025-03-22 19:26:42

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次*/

热点内容
安卓下载提示音在哪个文件夹 发布:2025-03-23 15:17:08 浏览:82
数据库表中数据类型 发布:2025-03-23 15:16:14 浏览:581
如何让其他人都能连上服务器 发布:2025-03-23 15:01:34 浏览:43
androidbus 发布:2025-03-23 14:55:34 浏览:563
交叉编译目录 发布:2025-03-23 14:53:08 浏览:178
javaruby 发布:2025-03-23 14:44:59 浏览:914
哪些汽车配置了激光大灯 发布:2025-03-23 14:34:18 浏览:611
aiony怎么选配置 发布:2025-03-23 14:32:36 浏览:294
在线scratch编程平台 发布:2025-03-23 14:31:47 浏览:704
三国杀配置怎么调 发布:2025-03-23 14:25:19 浏览:662