宏定义的编译顺序
⑴ c语言中“宏”是个什么东西 有什么意义
宏定义的作用在预编译阶段,形如 #define A B 就是宏定义了,作用就是在预编译阶段将程序中的A全部视为B,举个例子:
我们在程序最开始,声明如下宏定义
#define pi 3.1415926
那么在我们写程序的时候,我们可以直接使用pi作为一个常量来使用,那么当我们编译程序的时候,编译器会自动将程序中出现的pi替换成3.1415926
第二个例子,利用宏定义定义傻瓜函数
#define mul(A,B) A*B
那么我们可以将mul()在程序中当成函数来使用,为什么叫做傻瓜函数一会来解释,使用方法
mul(3,5) 那么这段代码就相当于计算3*5=15
那么当我们如下使用时就会出现问题
mul(3+2,3) 我们期待的结果是15,而实际结果是9,为什么呢?因为在程序会如下转换
3+2*3=3+6=9 这也就是为什么我们管宏定义出来的函数叫傻瓜函数的原因了~~~
楼主呀~~~完全手写,一定要好评呀!^_^
⑵ 计算机编译系统对宏定义在编译时进行语法检查这句话为什么错
第一步被换为area=a*b。
宏定义末尾不加分号,减少输入错误和便于修改。宏替换在编译前进行,不做表达式求解函数调用在编译后程序运行时进行,只占编译时间。
除了一般的字符串替换,函数调用不会。
宏展开不占运行时间,不分配内存。
宏的哑实结合不存在类型,作用域为其后的程序,还要做参数代换。
格式:数组大小常用宏定义。
预处理是在编译之前的处理。
宏定义又称为宏代换;
",利用宏则可以设法得到多个值。
宏展开使源程序变长。
函数只有一个返回值,预处理不做语法检查。一切以换为前提,准确理解之前就“换”;宏"1;第一步换为area=r*r;
正确的宏定义是#define
S(r)
(r)*(r);
宏名和参数的括号间不能有空格;
宏替换只作替换:
#define
宏名(参数表)
字符串;
例如、值传递:
#define
标识符
字符串;
其中的标识符就是所谓的符号常量,b)
a*b;
area=S(3:
(1)宏名一般用大写;
(2)使用宏可提高程序的通用性和易读性,也没有类型转换,第二步被换为area=3*2,而编译工作的任务之一就是语法检查:将宏名替换为字符串.带参数的宏、做任何事情之前先要换,并且分配内存。
预处理(预编译)工作也叫做宏展开;中永远不包含宏。
(3)宏定义不分配内存;
(4)宏定义写在函数的花括号外边;
,不做计算:
#define
PI
3,第二步被换为area=a+b*a+b:
(5)实参如果是表达式容易出问题:
#define
S(r)
r*r
area=S(a+b)。
即在对相关命令或语句的含义和功能作具体分析之前就要换;
类似于函数调用。
格式.1415926。
把程序中出现的PI全部换成3。
(6)可以用#undef命令终止宏定义的作用域。
(7)宏定义可以嵌套。
(8)字符串",变量定义分配内存,通常在文件的最开头。1415926说明,也称为“宏名”,简称“宏”、宏替换。
⑶ 璇﹁В瀹忓畾涔(#define)
璇﹁В瀹忓畾涔(#define)镄勮В閲婂备笅锛
C璇瑷涓鐢ㄥ埌瀹忓畾涔夌殑鍦版柟寰埚氾纴濡傚湪澶存枃浠朵腑涓轰简阒叉㈠ご鏂囦欢琚閲嶅嶅寘钖锛屽垯鐢ㄥ埌锛#ifndefcTest_Header_h#definecTest_Header_h//澶存枃浠跺唴瀹#endif鍦ㄦ垜浠甯哥敤镄 stdio.h 澶存枃浠朵腑涔熷彲浠ヨ佸埌寰埚氩畯瀹氢箟锛屽傦细
#define BUFSIZ1024//缂揿啿鍖哄ぇ灏#define EOF(-1)//琛ㄦ枃浠舵汤灏#ifndef SEEK_SET#define SEEK_SET 0 //琛ㄧず鏂囦欢鎸囬拡浠庢枃浠剁殑寮澶村紑濮#endif#ifndef SEEK_CUR#define SEEK_CUR 1//琛ㄧず鏂囦欢鎸囬拡浠庣幇鍦ㄧ殑浣岖疆寮濮#endif#ifndef SEEK_END#define SEEK_END 2//琛ㄧず鏂囦欢鎸囬拡浠庢枃浠剁殑链灏惧紑濮#endif
浠庡紑濮嫔啓C璇瑷鍒扮敓鎴愭墽琛岀▼搴忕殑娴佺▼澶ц嚧濡备笅锛埚戜笖蹇界暐棰勫勭悊涔嫔墠镄勭紪璇戝櫒镄勭炕璇戝勭悊娴佺▼绛夛级锛屽湪杩涜岀紪璇戠殑绗涓娆℃壂鎻忥纸璇嶆硶镓鎻忓拰璇娉曞垎鏋愶级涔嫔墠锛屼细链夌敱棰勫勭悊绋嫔簭璐熻矗瀹屾垚镄勯勫勭悊宸ヤ綔銆
棰勫勭悊宸ヤ綔鏄绯荤粺寮旷敤棰勫勭悊绋嫔簭瀵规簮绋嫔簭涓镄勯勫勭悊閮ㄥ垎锅氩勭悊锛岃岄勫勭悊閮ㄥ垎鏄鎸囦互钬#钬濆紑澶寸殑銆佹斁鍦ㄥ嚱鏁颁箣澶栫殑銆佷竴鑸鏀惧湪婧愭枃浠剁殑鍓嶉溃镄勯勫勭悊锻戒护锛屽傦细鍖呮嫭锻戒护#include锛屽畯锻戒护#define绛夛纴钖堢悊鍦板埄鐢ㄩ勫勭悊锷熻兘鍙浠ヤ娇寰楃▼搴忔洿锷犳柟渚垮湴阒呰汇佷慨鏀广佺Щ妞嶃佽皟璇旷瓑锛屼篃链夊埄浜庢ā鍧楀寲绋嫔簭璁捐°傛湰鏂囦富瑕佷粙缁嶅畯瀹氢箟镄勪互涓嫔嚑涓閮ㄥ垎锛
5銆佸彲鍙桦畯锛气﹀拰__VA_ARGS__
鎴戜滑缁忓父瑕佽緭鍑虹粨鏋沧椂瑕佸氭′娇鐢╬rinf(钬溾︹,钬)锛涘傛灉鐢ㄤ笂闱渚嫔瓙#defineSUM(a,b)printf(#a钬+钬#b钬=%d 钬,((a)+(b)))锛屽垯镙煎纺姣旇缉锲哄畾锛屼笉鑳界敤浜庤緭鍑哄叾浠栨牸寮忋傝繖镞舵垜浠鍙浠ヨ冭槛鐢ㄥ彲鍙桦畯锛圴ariadicMacros锛夈傜敤娉曟槸锛
#define PR(...)printf(__VA_ARGS__)//瀹忓畾涔埘R("hello
")锛//瀹忚皟鐢//杈揿嚭缁撴灉锛歨ello
鍦ㄥ畯瀹氢箟涓锛屽舰鍙傚垪琛ㄧ殑链钖庝竴涓鍙傛暟涓虹渷鐣ュ彿钬溾︹濓纴钥屸淿_VA_ARGS__钬濆氨鍙浠ヨ鐢ㄥ湪镟挎崲鏂囨湰涓锛屾潵琛ㄧず鐪佺暐鍙封溾︹濅唬琛ㄤ简浠涔堛傝屼笂闱渚嫔瓙瀹忎唬鎹涔嫔悗涓猴细printf(钬渉ello 钬);
杩樻湁涓渚嫔瓙濡傦细
#define PR2(X,...)printf("Message"#X":"__VA_ARGS__)//瀹忓畾涔塪oublemsg=0;PR2(1,"msg=%.2f
",msg)锛//瀹忚皟鐢//杈揿嚭缁撴灉锛歁essage1:msg=10.00
鍦ㄥ畯璋幂敤涓锛孹镄勫间负10锛屾墍浠#X琚镟挎崲涓衡1钬濄傚畯浠f崲钖庝负锛歱rintf("Message""1"":""msg=%.2f ",msg)锛涙帴镌杩4涓瀛楃︿覆杩炴帴鎴愪竴涓锛歱rintf("Message1:msg=%.2f ",msg)锛涜佹敞镒忕殑鏄锛氱渷鐣ュ彿钬溾︹濆彧鑳界敤𨱒ユ浛鎹㈠畯镄勫舰鍙傚垪琛ㄤ腑链钖庝竴涓锛
⑷ C语言编译系统对宏替换的处理是在什么时候进行的
是正式工作开始之前的准备工作,所以宏替换是在对程序编译之前进行的。
宏替换是C/C++的预处理中的一部分,对于宏定义中的形参,在替换列表中,如果不是作为#或##的操作数,那么将对应实参完全展开(相当于对实参进行求值),然后将替换列表中的形参替换掉,如果是#或##的操作数。
(4)宏定义的编译顺序扩展阅读:
宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力。
计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。
⑸ 在C语言中 宏定义是什么
宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
宏定义又称为宏代换、宏替换,简称“宏”。
(5)宏定义的编译顺序扩展阅读:
宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。
解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSIC,作为C语言最初的标准。
目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、TurboC等。
参考资料:
宏定义-网络
C语言-网络