C语言Define

一.不带参数的宏定义

不带参数的宏定义的格式: #define 标识符 字符或字符串

其中,标识符称为宏名。例如:#define PI 3.1415926

其作用是将宏名PI定义为实数3.1415926.在编译预处理时,将该define命令后所有出现PI的地方均用3.1415926来替换。这种替换过程称为“宏替换”或“宏扩展”或“宏展开”。

对于不带参数的宏定义以及宏替换有以下说明:

(1)习惯上,宏名用大写字母来表示,以区别于变量名。当然,从语法上讲,任一合法的标识符均可用作宏名。

(2)宏定义可出现在程序的任何位置。通常用宏定义放在源程序文件的开始。宏名的作用域为从宏定义开始到本源程序文件结束。

(3)在宏定义中可以使用已定义的宏名。

(4)宏扩展时,只对宏名做简单的代换,不作任何计算,也不作任何语法检查。若宏定义时书写不正确,会得到不正确的结果或编译时出现语法错误。

(5)若要终止宏名的作用域,可以使用预处理命令。

(6)当宏名出现在字符串中时,编译预处理不进行宏扩展。例如:

二.带参数的宏定义

带参数的宏定义在进行宏扩展时与不带参数的宏定义有所不同,进行预处理时,不仅对对应的宏名进行替换,而且对参数也进行替换。带参数宏定义的一般格式为:#define 宏名(参数表) 使用参数的字符或字符串

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

          b=AREA(2.0,7.8)            //A

定义了求长方形面积的宏AREA,它带有两个参数,分别表示长和宽。使用带参的宏称为宏调用,在宏定义中的参数称为形参,在宏调用中给出的参数称为实参。在对宏调用进行扩展时,先依次用实参替代宏定义中的形参,并将替代后的字符串替代宏调用。如A行中的宏调用经宏扩展为:b=2.0*7.8即将实参替代宏定义中的形参,其余不变。注意:宏扩展仅作简单替代,不作任何计算。

对带参的宏定义,说明以下几点:

(1)当宏调用的实参可能包含表达式时,在宏定义中要用括号把形参括起来或在宏调用中把实参括起来,以便减少错误。

(2)在宏定义时,宏名与左括号间不能有空格,这与函数的定义是不一样的。若在宏名后有空格,则将空格后所有字符作为无参宏所定义的字符串,而不作为形参。例如:#define AREA (a,b) (a*b) 则编译预处理程序认为是将无参宏AREA定义为“(a,b) (a*b)”,而不将(a,b)作为参数。

3)当一个宏定义多余一行时,必须使用续行符“\”,即在按换行符(Enter键)之前先输入一个“\”。

(4)带参宏定义主要用来取代功能简单、代码短小、运行时间极短、调用频繁的程序代码,与内联函数的作用极其相似。




### C语言 `define` 宏定义使用方法 在C语言中,宏定义通过预处理器指令 `#define` 实现。当编译器遇到此指令时,在实际编译之前会执行相应的替换操作。 #### 基本形式 最简单的宏定义用于常量替代: ```c #define PI 3.1415926 ``` 这条语句表示在整个源文件范围内任何地方出现的标识符PI都将被数值3.1415926所代替[^2]。 #### 参数化宏 带有参数的宏可以像函数一样调用,但它们不是真正的函数而是文本替换: ```c #define SQUARE(x) ((x)*(x)) ``` 这里定义了一个名为SQUARE的一元运算符风格的宏,它接受一个输入并返回该数与其自身的乘积。注意双括号是为了防止某些情况下优先级错误引发的问题[^3]。 #### 条件判断宏 还可以创建更复杂的表达式作为宏体: ```c #define MAX(a, b) (((a) > (b)) ? (a) : (b)) ``` 这段代码实现了两个值之间的最大值比较逻辑。同样地,额外的小括号有助于确保正确的求值顺序。 #### 输出信息宏 对于调试目的来说,经常需要用到打印功能来显示变量的状态或其他运行期数据: ```c #define PRINT_COUNT(x) printf("the count is %d\n", x) ``` 上述例子展示了如何构建一个方便使用的计数输出接口,其中包含了固定的前缀文字以及待传入的具体数值部分。 #### 取消宏定义 如果希望在一个特定的作用域之后不再应用某个宏,则可以通过 `#undef` 指令取消其有效性: ```c #undef PI ``` 这样做的好处是可以避免不同模块间可能存在的命名冲突问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值