预处理命令--带参宏定义
2007-12-14 17:27
330 查看
带参宏定义
1.带参宏定义的一般格式
#define 宏名(形参表) 语言符号字符串
字符串中包含在括弧中所指定的参数,如:
#define S(a,b) a*b
Area = S(3,2);
2.带参宏的调用和宏展开
(1)调用格式:宏名(实参表)
(2)宏展开:用宏调用提供的实参字符串,直接置换宏定义命令行中、相应形参字符串,非形参字符保持不变。
3.说明
(1)定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。
(2)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。
(3)虽然有参宏与有参函数确实有相似之处,但不同之处更多,主要有以下几个方面:
1)调用有参函数时,是先求出实参的值,然后再复制一份给形参。而展开有参宏时,只是将实参简单地置换形参。
2)在有参函数中,形参是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参是没有类型信息的,因此用于置换的实参,什么类型都可以。有时,可利用有参宏的这一特性,实现通用函数功能。
3)使用有参函数,无论调用多少次,都不会使目标程序变长,但每次调用都要占用系统时间进行调用现场保护和现场恢复;而使用有参宏,由于宏展开是在编译时进行的,所以不占运行时间,但是每引用1次,都会使目标程序增大1次。
1.带参宏定义的一般格式
#define 宏名(形参表) 语言符号字符串
字符串中包含在括弧中所指定的参数,如:
#define S(a,b) a*b
Area = S(3,2);
2.带参宏的调用和宏展开
(1)调用格式:宏名(实参表)
(2)宏展开:用宏调用提供的实参字符串,直接置换宏定义命令行中、相应形参字符串,非形参字符保持不变。
3.说明
(1)定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。
(2)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。
(3)虽然有参宏与有参函数确实有相似之处,但不同之处更多,主要有以下几个方面:
1)调用有参函数时,是先求出实参的值,然后再复制一份给形参。而展开有参宏时,只是将实参简单地置换形参。
2)在有参函数中,形参是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参是没有类型信息的,因此用于置换的实参,什么类型都可以。有时,可利用有参宏的这一特性,实现通用函数功能。
3)使用有参函数,无论调用多少次,都不会使目标程序变长,但每次调用都要占用系统时间进行调用现场保护和现场恢复;而使用有参宏,由于宏展开是在编译时进行的,所以不占运行时间,但是每引用1次,都会使目标程序增大1次。
相关文章推荐
- 预处理命令(宏定义,条件编译,头文件)
- 预处理命令--无参宏定义
- 预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等
- 预处理命令与宏定义
- C基础:关于预处理宏定义命令
- 预处理命令--宏定义
- VC中预处理指令与宏定义的妙用
- 第9章 预处理命令
- C语言之预处理命令
- 预处理命令详解
- C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- C语言学习(五)函数,预处理命令
- (谭版)9 预处理命令
- 简单的Linux基本操作,预处理标识符以及宏定义
- C语言 预处理二(宏定义--#define)
- VC中预处理指令与宏定义的妙用之一
- C语言预处理——宏定义
- C语言第十一回合:预处理命令的集中营
- C预编译命令,C++预编译命令,C宏定义,C++宏定义
- C++基础之预处理命令