A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、预处理指令的概念及分类
1.基本概念
以“#”号开头指令都称为【预处理指令】。如包含命令#include 等。在源程序中这些命令都放在函数之外。而且一般都放在源文件的前面,他们称为【预处理部分】

所谓预处理是指在进行编译的第一道扫描(词法扫描和语法扫描)之前所做的工作,预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分做处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能。如宏定义,文件包含,条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。

二、宏的概念及无参宏定义方法
1.宏的概念
被定义为“宏”的标识符称为“宏名”,在编译预处理时,都用宏定义中的字符串取代换,这称为“宏代换”或“宏展开”
例如 #define Row 10 //此处Row就是一个宏

宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为【有参宏】和【无参宏】

无参宏的宏名不带参数,其定义一般形式为:

#define 标识符 字符串

其中"#" 表示这是一掉预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”位所定义的宏名。“字符串”可以使常熟,表达式、格式串等

例如:
  1. //定义一个宏
  2. #define PI 3.1415926
  3. #define Area PI*4
  4. #include <stdio.h>

  5. int main(int argc, const char * argv[])
  6. {

  7.     printf("area = %0.4f",Area);//预处理时,Area会被替换成3.1415926*4
  8.     return 0;
  9. }
复制代码


打印结果

【注意】
1、宏定义式一个预处理指令,结尾不需要加“;”
2、宏定义替换问题
例如:

  1. //定义一个宏
  2. #define PI 3.1415926
  3. #define Sum a*b+2*b
  4. #include <stdio.h>

  5. int main(int argc, const char * argv[])
  6. {

  7.     int a = 2,b =3;
  8.    
  9.     printf("a2*Sum+ 3*Sum = %0d\n",2*Sum+ Sum);//预处理时,2*Sum+ Sum会被替换成2*a*b+2*b+a*b+2*b = 30而不是2*(a*b+2*b) +(a*b+2*b) = 36.
  10.     printf("2*a*b+2*b+a*b+2*b = %d\n", 2*a*b+2*b+a*b+2*b);
  11.     printf("2*(a*b+2*b) +(a*b+2*b) = %d", 2*(a*b+2*b) +(a*b+2*b));
  12.     return 0;
  13. }
复制代码

打印结果:
a2*Sum+ 3*Sum = 30
2*a*b+2*b+a*b+2*b = 30

2*(a*b+2*b) +(a*b+2*b) = 36

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马