
第7章编译预处理 宏定义 文件包含 条件编译
1 2 3 第7章 编译预处理 宏定义 文件包含 条件编译

任务一宏定义 字符串宏 一般来说,常量都具有一定的意义,但在程序中通常 使用的常量,却很难看出它的意义,以致程序的可读 性降低,为此C语言提供了一个用符号来表示一个常 量的方法,即字符串宏来解决此类问题
任务一 宏定义 “计算机程序”是让计算机完成某项特定任务,而编制的一组指示计算机工作 的指令。计算机就像一个优秀的士兵,他无条件服从长官(程序编写者)的命 令,为了完成一项军事任务,长官下达的一系列命令就是“程序”。 一般来说,常量都具有一定的意义,但在程序中通常 使用的常量,却很难看出它的意义,以致程序的可读 性降低,为此 C 语言提供了一个用符号来表示一个常 量的方法,即字符串宏来解决此类问题。 一、 字符串宏

任务一宏定义 字符串宏的定义形式为: #define标识符字符串 【案例7-1】计算圆面积和周长 【解题思路】 计算圆的面积一定会用到圆周率π,它的精度会根据题目的要求而改变, 如果它在程序中多次出现,修改程序时也会分别对每一个常量进行修改。 用字符串宏的方法可以很好地解决这一问题,每次只改动一个位置即可
任务一 宏定义 字符串宏的定义形式为: #define 标识符 字符串 【案例7-1】计算圆面积和周长 【解题思路】 计算圆的面积一定会用到圆周率 π,它的精度会根据题目的要求而改变, 如果它在程序中多次出现,修改程序时也会分别对每一个常量进行修改。 用字符串宏的方法可以很好地解决这一问题,每次只改动一个位置即可

任务一宏定义 【程序代码】 #include #define PAl 3.14 void main() float r=3,s,l; S=PAI*r*r; I=2*PAl*r; printf("I=%f\n",l);
任务一 宏定义 【程序代码】 #include #define PAI 3.14 void main() { float r=3,s,l; s=PAI*r*r; l=2*PAI*r; printf("l=%f\n",l);

任务一宏定义 printf("s=%f n",s); } 【运行结果】 r=18.840000 s=28.260000 如果想提高计算精度,可直接修改为:#define PA13.14159
任务一 宏定义 printf("s=%f\n",s); } 【运行结果】 r=18.840000 s=28.260000 如果想提高计算精度,可直接修改为:#define PAI 3.14159

任务一宏定义 说明: 1 2 宏标识符一般使用 执行预处理命令时 宏定义一般放在源 大写字母表示,以 只作简单的替换 程序文件的开始部 便与程序中的变量 即使将前面例子中 分,宏标识符只在 相区别,这不是语 的数字字符3.14中 该文件内有效。如 法所要求的,而是 的数字1写成小写 要终止其作用域可 人们的一种习惯。 字母【,只有到编 使用#undefa命令 译时才会发现错误 ,替换时不进行任 何语法检查
任务一 宏定义 说明: 宏标识符一般使用 大写字母表示,以 便与程序中的变量 相区别,这不是语 法所要求的,而是 人们的一种习惯。 执行预处理命令时 只作简单的替换, 即使将前面例子中 的数字字符3.14中 的数字1写成小写 字母 l,只有到编 译时才会发现错误 ,替换时不进行任 何语法检查。 3 宏定义一般放在源 程序文件的开始部 分,宏标识符只在 该文件内有效。如 要终止其作用域可 使用# undef命令 。 1 2

任务一宏定义 说明: 4 6 程序中出现在用双 宏定义不是说明或 宏定义允许嵌套, 引号里面的字符串 语句,在行末不必 在宏定义的字符串 如果与宏名相同, 加分号,如加上分 中可以使用已经定 则不进行替换。 号则连分号也一起 义的宏名。在宏展 置换。 开时由预处理程序 层层代换
任务一 宏定义 说明: 程序中出现在用双 引号里面的字符串 如果与宏名相同, 则不进行替换。 宏定义不是说明或 语句,在行末不必 加分号,如加上分 号则连分号也一起 置换。 6 宏定义允许嵌套, 在宏定义的字符串 中可以使用已经定 义的宏名。在宏展 开时由预处理程序 层层代换。 4 5

任务一宏定义 带参数宏 宏定义中,可以使用参数,带参数的宏的定义形式为: #define标识符(参数表)字符串 其中字符串中应包含参数表中的所指定的参数,如果参数有两个以 上,之间用,”号分隔
任务一 宏定义 带参数宏 宏定义中,可以使用参数,带参数的宏的定义形式为: #define 标识符(参数表) 字符串 其中字符串中应包含参数表中的所指定的参数,如果参数有两个以 上,之间用“ , ”号分隔

任务一宏定义 【案例7-2】使用带参数的宏计算长方形的面积 【解题思路】 计算长方形面积,需要长和宽两个参数,所以定义带两个参数的宏 ,参数之间用逗号分开,后面的字符串中表示用这两个参数计算出面 积的公式。 【程序代码】 #include #define are(h,w)(h)*(w) void main ( { int a=3,b=5,c; c=are(a+1,b); printf("c=号d\n",c);
任务一 宏定义 【案例7-2】使用带参数的宏计算长方形的面积 【解题思路】 计算长方形面积,需要长和宽两个参数,所以定义带两个参数的宏 ,参数之间用逗号分开,后面的字符串中表示用这两个参数计算出面 积的公式。 【程序代码】 #include #define are(h,w) (h)*(w) void main() { int a=3,b=5,c; c=are(a+1,b); printf("c=%d\n",c); }

任务一宏定义 【运行结果】 c=20 应该注意,h和w参数没有类型问题,使用括号也是必要的,如果将 宏定义为下面形式: #define are(x,y)x*y 则表达式are(a+1,b)的值等于8,而不是20,因为替换的结果 为a+1*b。 对于带参的宏定义有以下问题需要说明: (1)带参宏定义中,宏名和形参表之间不能有空格出现
任务一 宏定义 【运行结果】 c=20 应该注意,h和w参数没有类型问题,使用括号也是必要的,如果将 宏定义为下面形式: #define are(x,y) x*y 则表达式 are(a+1,b)的值等于8,而不是 20,因为替换的结果 为a+1*b。 对于带参的宏定义有以下问题需要说明: (1)带参宏定义中,宏名和形参表之间不能有空格出现