问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中的“宏”是指什么?

发布网友 发布时间:2022-03-30 02:36

我来回答

4个回答

热心网友 时间:2022-03-30 04:06

宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串。

1、条件编译:

C语言中,预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号。

预处理指令是以#开头的代码行,#必须是该行除了空白字符外的第一个字符。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符。

使用宏进行条件编译的用法与使用宏防止多重引用类似。示例如下:

使用条件编译,方便程序员在调试程序的过程中,执行一些在程序发布后并不需要执行的指令。只要在需要调试的代码前加上_DEBUG的定义,就可以在调试程序的过程中输出调试信息。

这样方便查看程序在运行过程中有没有出现错误,定位错误出现的地方。而在程序发布之前,取消_DEBUG的定义就可以不再执行调试代码。

2、宏函数:

函数的调用是需要一定的时间和空间代价的。因为系统在调用函数时,需要保留"现场",即将程序要执行的指令的下一条指令的位置压入栈,然后转入调用函数去执行,调用完函数后再返回主调函数,恢复"现场",返回到栈里保存的的下一条指令的位置继续执行。

所以函数的调用需要额外的时间和空间代价。

而宏函数则不存在上述问题,宏函数在预编译时,同函数定义的代码来替换函数名,将函数代码段嵌入到当前程序,不会产生函数调用。

所以会省去普通函数保留现场恢复现场的时间,但因为要将定义的函数体嵌入到当前程序,所以不可避免的会占用额外的存储空间。

在频繁调用同一个宏的时候,该现象尤其明显。宏函数的示例定义如下:

#define MAX(a,b) ((a)<(b)?(b):(a))

宏函数的优点在于避免函数调用,提高程序效率。

同时需要注意的是inline标识符。inline也将函数定义为内联的。但是使用内联函数需要注意的是:函数体必须十分简单,不能含有循环、条件、选择等复杂结构,否则就不能作为内联函数了。

事实上,有时候即便你没有将函数指定为内联函数,编译器也会将一些简单的函数作为内联函数处理,而对于一些复杂的函数,即使声明为内联函数,编译器也不会理会的。

inline函数的瓶颈就在于此,使用inline标识符将函数声明为内联的,但这只是一种提示,到底编译器有没有优化还依赖于编译器的实现,而使用宏函数则完全由代码本身控制。

但在使用宏函数的时候,需要明确的是宏函数只是简单的替换,需要注意括号的使用。

扩展资料:

宏的更多规则特性:

(1)宏名一般用大写。

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号。

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域。

(7)宏定义不可以嵌套。

(8)字符串" "中永远不包含宏。

(9)宏定义不分配内存,变量定义分配内存。

(10)宏定义不存在类型问题,它的参数也是无类型的。

参考资料:

百度百科--宏定义

热心网友 时间:2022-03-30 05:24

是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。

“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
计算机语言如C语言或 汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。

在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。

宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-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代码调用它们,使用时只需给出这个指令代码就能执行其功能,也可以像调用子程序一样使用。

参考资料来源:百度百科——宏程序

参考资料来源:百度百科——宏定义

参考资料来源:百度百科——宏命令

热心网友 时间:2022-03-30 06:58

简单来说:宏定义又称为宏代换、宏替换,简称“宏”。是C提供的三种预处理功能的其中一种。

复杂的请看下面,讲的很全。下面的带参宏定义,多行宏定义,在Linux内核源码中很多。另外sizeof也是一个宏定义。

宏定义

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译

1. 不带参数的宏定义:

宏定义又称为宏代换、宏替换,简称“宏”。

格式: #define 标识符 字符串

其中的标识符就是所谓的符号常量,也称为“宏名”。

预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。

掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。

即在对相关命令或语句的含义和功能作具体分析之前就要换:

例:   #define PI 3.1415926   把程序中出现的PI全部换成3.1415926

说明:

(1)宏名一般用大写

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号;

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域

(7)宏定义可以嵌套

(8)字符串" "中永远不包含宏

(9)宏定义不分配内存,变量定义分配内存。

2. 带参数的宏定义:

除了一般的字符串替换,还要做参数代换

格式:   #define 宏名(参数表) 字符串

例如:#define S(a,b) a*b

area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;

类似于函数调用,有一个哑实结合的过程:

(1)实参如果是表达式容易出问题

#define S(r) r*r

area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;

正确的宏定义是#define S(r) ((r)*(r))

(2)宏名和参数的括号间不能有空格

(3)宏替换只作替换,不做计算,不做表达式求解

(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存

(5)宏的哑实结合不存在类型,也没有类型转换。

(6)函数只有一个返回值,利用宏则可以设法得到多个值

(7)宏展开使源程序变长,函数调用不会

(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

3. 宏定义其他冷门、重点知识

#define用法

1、 用无参宏定义一个简单的常量

#define LEN 12

这个是最常见的用法,但也会出错。

比如下面几个知识点你会吗?可以看下:

(1) #define NAME "zhangyuncong"

程序中有"NAME"则,它会不会被替换呢?

(2) #define 0x abcd

可以吗?也就是说,可不可以用把标识符的字母替换成别的东西?

(3) #define NAME "zhang

这个可以吗?

(4) #define NAME "zhangyuncong"

程序中有上面的宏定义,并且,程序里有句:

NAMELIST这样,会不会被替换成"zhangyuncong"LIST

四个题答案都是否定的。

第一个,""内的东西不会被宏替换。这一点应该大都知道。

第二个,宏定义前面的那个必须是合法的用户标识符

第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。

第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。

也就是说,这种情况下记住:#define 第一位置第二位置

(1) 不替换程序中字符串里的东西。

(2) 第一位置只能是合法的标识符(可以是关键字)

(3) 第二位置如果有字符串,必须把""配对。

(4) 只替换与第一位置完全相同的标识符

还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。

2、 带参宏一般用法

比如#define MAX(a,b) ((a)>(b)?(a):(b))

则遇到MAX(1+2,value)则会把它替换成:

((1+2)>(value)?(1+2):(value))

注意事项和无参宏差不多。

但还是应注意

#define FUN(a) "a"

则,输入FUN(345)会被替换成什么?

其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。

也就是说,""内的字符不被当成形参,即使它和一模一样。

那么,你会问了,我要是想让这里输入FUN(345)它就替换成"345"该怎么实现呢?

请看下面关于#的用法

3、 有参宏定义中#的用法

#define STR(str) #str

#用于把宏定义中的参数两端加上字符串的""

比如,这里STR(my#name)会被替换成"my#name"

一般由任意字符都可以做形参,但以下情况会出错:

STR())这样,编译器不会把“)”当成STR()的参数。

STR(,)同上,编译器不会把“,”当成STR的参数。

STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)

STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。    4、 有参宏定义中##的用法

#define WIDE(str) L##str

则会将形参str的前面加上L

比如:WIDE("abc")就会被替换成L"abc"

如果有#define FUN(a,b) vo##a##b()

那么FUN(id ma,in)会被替换成void main()

5、 多行宏定义:

#define doit(m,n) for(int i=0;i<(n);++i)\

{\

m+=i;\

}

热心网友 时间:2022-03-30 08:50

宏是编译器的东西,是纯粹的“字符替换”,与编程语言其他什么一切都无关。仅仅是帮助你更好地输入字符。
例如:下面程序
void main()
{
double x,y;
x=3.1415926535897932384626433832795;
y=x+3.1415926535897932384626433832795;
y/=3.1415926535897932384626433832795;
x=sin(3.1415926535897932384626433832795*y);
}
相信你输入程序时候很苦恼,并且如果其中某个3.1415926535897932384626433832795被错改了一小数位的话,造成的错误极其难发现。
所以,利用字符替换的原理,可以把程序简化位:
#define PIE 3.1415926535897932384626433832795
void main()
{
double x,y;
x=PIE ;
y=x+PIE ;
y/=PIE ;
x=sin(PIE *y);
}
这样就美观多了。最重要的是,保证了所有PIE都相等。
上面两个程序完全一样,编译器帮助你进行了字符替换工作。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
app data文件夹放在哪里? ...管走向清晰,胆囊体积正常,壁不光滑,囊内透声尚可, 交通事故的误工费和护理费怎么算? 郑中基的《唯一的理由》是从什么英文歌改编过来的? 有一个男的在六年前唱的中文歌歌词第一句是One什么什么two什么... 长沙适合小孩看表演的地方 长沙最值得一去的演艺厅 长沙戏剧谷话剧简介 长沙戏剧谷演出介绍 长沙戏剧谷场馆介绍 cswa认证考试时间 ACI国际认证考试时间? AutoCAD有一个资格认证考试在什麽时间? ccnp认证考试 三门考试时间能间隔多久 ?考试费用多少 采购与供应链管理国际资格认证的考试时间 微软认证考试的考试时间 sap pa认证的认证时间 今年IPA认证考试时间是什么时候,一年有几次? SAP认证的认证考试 CIPS认证考试一般每年什么时候开考? ERP工程师职业能力认证考试时间 华为p30如何设置黑名单电话提示音 华为p30pro怎么看拦截电话 华为P30lite没有名字的来电怎么屏蔽? p30pro双卡怎么装 华为p30怎么拦截境外电话 华为p30怎么拦截某个省份电话 宏的定义是什么 QQ音乐,周杰伦的歌都付费了,不听了? 周杰伦的歌为什么不能听了? 美团开了轻享版还能用尊享吗 美团尊享会员会自动续费吗 美团尊享额度怎么恢复 连和联有什么区别呢? 美团月付可以加油吗?扫码 冰粉的原料 冰粉的原料是什么 冰粉是什么原料做成的 做冰粉是用生石灰还是熟石灰 鏈夐┈娑﹀湪灏辫屼簡锛屾垜浠鍦ㄤ笉鍦ㄦ剰涔変笉澶是什么字 冰粉是用什么材料做的 冰粉什么做的 冰粉粉是什么原料做的? 冰粉原料 冰粉粉的成份和作用 冰粉的制作方法是什么? 冰粉都是用什么原料做的呢? 什么是冰粉 什么是宏定义? 怎么在WPS表格中用身份证号提取年龄?