预处理命令--宏定义
时间:2010-11-29 来源:licong0527
在说关于有关宏定义的知识前,要先说一个概念。
预处理命令:在编译源程序前先对源程序进行处理。
用#表示该行为编译预处理命令。
在C语言编程中加入一些编译预处理命令可以提高编程效率,加快编译速度。
注:预处理命令不是C语言的一部分,因此每条编译预处理命令不需要以分号来结束。
宏定义就属于预处理命令的一种。那么,什么是宏呢?
宏:c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。
宏分为两种:
1、无参数宏 #define 标识符 字符串
2、带参数宏 #define 标识符(形参表) 字符串
因为无参数宏比较简单,所以重点说一下带参数宏。
e.g. #define MUL(x,y) x*y
* 首先,说一下应该要注意的问题或者说是容易犯错的地方。
1、宏替换后没有;(分号),因为它不是语句;
2、宏名与形参表的圆括号之间不能有空格,否则会导致错误;
如上面的例子,MUL与(之间不能有空格。
3、在宏替换中,字符串内的形参最好用括号括起来,以避免错误。
如上面的例子,x*y应写为(x)*(y)
因为宏定义的过程本质是替换,所以若x=a+1,y=b+1,那么,按原来的,
就为 a+1*b+1,而不是我们想表示的(a+1)*(b+1)了。
因此,我个人习惯将宏定义叫做宏替换。
* 其次,要说明带参数宏定义与函数的区别,因为二者比较相像,很容易搞混,所以在这里说明一下。
1、带参数的宏的形参不是变量,不分配内存空间,无需说明数据类型;
函数的形参是变量,分配内存空间,在函数定义时要指明参数的数据类型。
2、预处理程序认为有参数的宏的实参是字符串,并用字符串去替换形参;
函数则会计算实参的值,再去传给形参。
3、宏替换会在编译时使编译时间变长,而运行时间不会;
函数调用则会占用运行时间。
注:以上内容是参考人民邮电出版社的《LINUX C编程实战》,由童永清老师和吴伟民老师编著的
预处理命令:在编译源程序前先对源程序进行处理。
用#表示该行为编译预处理命令。
在C语言编程中加入一些编译预处理命令可以提高编程效率,加快编译速度。
注:预处理命令不是C语言的一部分,因此每条编译预处理命令不需要以分号来结束。
宏定义就属于预处理命令的一种。那么,什么是宏呢?
宏:c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。
宏分为两种:
1、无参数宏 #define 标识符 字符串
2、带参数宏 #define 标识符(形参表) 字符串
因为无参数宏比较简单,所以重点说一下带参数宏。
e.g. #define MUL(x,y) x*y
* 首先,说一下应该要注意的问题或者说是容易犯错的地方。
1、宏替换后没有;(分号),因为它不是语句;
2、宏名与形参表的圆括号之间不能有空格,否则会导致错误;
如上面的例子,MUL与(之间不能有空格。
3、在宏替换中,字符串内的形参最好用括号括起来,以避免错误。
如上面的例子,x*y应写为(x)*(y)
因为宏定义的过程本质是替换,所以若x=a+1,y=b+1,那么,按原来的,
就为 a+1*b+1,而不是我们想表示的(a+1)*(b+1)了。
因此,我个人习惯将宏定义叫做宏替换。
* 其次,要说明带参数宏定义与函数的区别,因为二者比较相像,很容易搞混,所以在这里说明一下。
1、带参数的宏的形参不是变量,不分配内存空间,无需说明数据类型;
函数的形参是变量,分配内存空间,在函数定义时要指明参数的数据类型。
2、预处理程序认为有参数的宏的实参是字符串,并用字符串去替换形参;
函数则会计算实参的值,再去传给形参。
3、宏替换会在编译时使编译时间变长,而运行时间不会;
函数调用则会占用运行时间。
注:以上内容是参考人民邮电出版社的《LINUX C编程实战》,由童永清老师和吴伟民老师编著的
相关阅读 更多 +