首页 理论教育C语言程序设计宏定义规则

C语言程序设计宏定义规则

【摘要】:不带参数的宏定义一般形式是:#define宏名字符串例如:#definePI3.1415926其中,宏名用标识符表示,也就是前面讨论过的符号常量,上面示例中的PI就是宏名。正确使用“宏定义”的关键是宏调用时的“原样替换”。宏定义使用的简单示例。④宏定义不存在类型问题,它的参数也是无类型的。⑦宏定义允许嵌套。如:#defineN100#defineM2*N#defineK5+M⑧可以用#undef或不带替换字符串的宏定义终止宏定义的作用域。

不带参数的宏定义一般形式是:

#define宏名 字符串

例如:#define PI 3.1415926

其中,宏名用标识符表示,也就是前面讨论过的符号常量,上面示例中的PI就是宏名。预处理过程中,将C源程序中的宏名用对应的字符串进行替换,如将PI替换为3.1415926,这个过程称为宏调用或宏展开。宏调用的格式为:

标识符宏定义预处理的工作只是纯粹的替换或展开,没有任何计算功能。正确使用“宏定义”的关键是宏调用时的“原样替换”。

【例9.1】 宏定义使用的简单示例。

上面程序在预处理时,语句sum=20+N;中出现的宏名(标识符N)代换为100。即将上面的程序处理成如下所示程序后再进行程序代码的编译工作。

在C程序中使用宏定义预处理时,还应注意以下几方面问题:

①宏名一般用大写,以区别程序中使用的变量名。

②宏定义不分配内存,变量定义分配内存。

③预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

④宏定义不存在类型问题,它的参数也是无类型的。

⑤宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。(www.chuimin.cn)

⑥字符串常量("")中永远不包含宏,即宏名出现在字符串常量中时,不进行替换工作。

⑦宏定义允许嵌套。如:

#define N 100

#define M 2*N

#define K 5+M

⑧可以用#undef或不带替换字符串的宏定义终止宏定义的作用域。如下面两条预处理命令都可以终止#define N 100的作用域。

#undef N

#define N⑨宏定义末尾不需要用分号结尾,如果末尾有分号,则分号将作为字符串的组成部分。如上例中,假设定义为:#define N 100;,则替换后变为sum=100;+20;,显然本程序是有语法错误的。假如本语句改为sum=20+100;;,此时程序并没有语法错误,语句后多余的分号可以看成一个空语句。预处理后也可以得到正确结果。

⑩使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。在阅读含有宏定义的源程序时,一定要掌握“先替换,后计算”的原则,切忌“边替换,边计算”。

【例9.2】 编写程序实现功能:输入100个实型数据到数组中,然后求出数组中所有元素之和。

上面程序中,如果设计时直接使用长度为100的数组,那么每次调试程序就需要输入100个数据,这样势必给程序的调试工作带来极大的工作量。程序中通过宏定义#define N 3的使用,使得在程序调试的时候仅需输入3个数据。当程序调试成功后,只需要将程序中宏定义语句修改为:#define N 100,然后重新编译即可实现对100个数据进行处理的程序设计要求。