标签:
C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。C语言的预处理命令有:#define, #undef, #include, #if, #else, #elif, #endif, #ifdef, #ifndef, #line, #pragma, #error。
(1)不带参数的宏定义命令行形式如下:
#define 宏名 替换文本
在#define、宏名和宏替换文本之间用空格隔开。例如:
#define SIZE 100
(2)替换文本中可以包含已定义过的宏名,例如:
#define PI 3.14
#define ADDPI (PI + 1)
#define TWO_ADDPI (2 * ADDPI)
(3)当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后紧接着加一个反斜线“\”。例如:
#define LEAP_YEAR year % 4 == 0\
&& year % 100 != 0 || year % 400 == 0
如果在“\”前或在下一行的开头留有空格,则在宏替换时也将加入这些空格。
(4)同一宏名不能重复定义,除非两个宏定义命令行完全一致。
(5)替换文本不能替换双引号中与宏名相同的字符串。例如,如果YES是已定义的宏名,则不能用与它相关的替换文本来替换 printf("YES") 中的YES。
(6)替换文本不会替换用户标识符中的成分。例如,宏名 YES,不会替换标识符 YESORNO 中的 YES。
(7)用作宏定义的标识符通常用大写字母表示,这并不是语法规定,只是一种习惯,便于与程序中的其他标识符相区别。
(8)C程序中,宏定义的定义位置一般写在程序的开头。
(1)带参数的宏定义命令行形式如下:
#define 宏名( 形参表 ) 替换文本
例如:
#define MU(X, Y) ((X) * (Y))
以上宏定义命令行中,MU(X, Y) 简称为“宏”,MU是用户标识符,称为宏名。宏名和左括号 "(" 必须紧挨着,它们之间不得留有空格。其中一对圆括号中由若干称为形参的标识符组成,各形参之间用逗号隔开。“替换文本”中应包含有形参。
(2)和不带参数的宏定义相同,同一宏名不能重复定义,除非两个宏定义命令行完全一致。
(3)在调用带参数的宏名时,一对圆括号必不可少,圆括号中实参的个数应该与形参个数相同,若有多个参数,它们之间用逗号隔开。在预编译时,编译预处理程序用“替换文本”来替换宏,并用对应的实参来替换“替换文本”中的形参。
(4)在“替换文本”中的形参和整个表达式应该用括号括起来,例如:
#define MU(x, y) ( (x) * (y) )
(5)宏替换和函数调用有相似之处,但在宏替换中,对参数没有类型要求。例如,调用 MU,既可以求两个整型数的乘积,也可求两个实型数的乘积。而如果是调用函数来求两个数的乘积,则对不同类型的参数就需要定义不同的函数。
(6)宏替换是在编译前由预处理程序完成的,因此宏替换不占用运行时间。而函数调用是在程序运行时进行的,在函数调用过程中需要占用处理时间。
可以用 #undef 提前终止宏定义的作用域。例如:
#define PI 3.14
main()
...
#undef PI
...
以上 PI 的作用域从#define PI 3.14 命令行开始,到#undef PI 命令行结束。从#undef 之后 PI 变成无定义,不再代表3.14。
C语言开发程序时,可以把一些宏定义按照功能分别存入不同的文件中。当需要使用某类宏定义时,就无需在程序中重新定义,而只要把这些宏定义所在的文件包含在程序的开头就可以了。
所谓文件包含,是指在一个文件中去包含另一个文件的全部内容。C语言用#include 命令行来实现文件包含的功能。#include 命令行的形式如下:
#include "文件名"
或
#include <文件名>
预编译时,预编译程序将用指定文件中的内容来替换此命令行。a.如果文件名用双引号括起来,系统先在源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到相关目录中查找;b.如果文件用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录查找。
说明:
(1)包含文件的#include 命令行通常应书写在所用源程序文件的开头,故包含文件又称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”。
(2)包含文件中,一般包含有一些公用的#define命令行、外部说明或对库函数的原型说明。例如 stdio.h 就是这样的头文件。
(3)当包含文件修改后,对包含文件的源程序必须重新进行编译连接
(4)一个程序中,允许有任意多个#include命令行。
标签:
原文地址:http://www.cnblogs.com/web1013/p/5393502.html