先写总结
(1)C语言的预处理命令都是以“#”号开始的,他们不是C语言的语句,是在预编译时处理的。
(2)宏定义分为两种:不带参数的宏和带参数的宏(所谓的函数宏)
(3)宏定义时末尾一般不要加分号
(4)宏扩展的整体或参数一般要用()括起来
(5)文件包含是编写C语言程序中不可缺少的,很重要
(6)使用条件编译的主要原因:一是便于移植程序,二是方便程序调试
不带参数的宏定义
#define 标识符 单词串
1宏名的作用域是从#define定义之后直到该宏定义所在文件结束,但通常把#define宏定义放在源程序文件的开头部分。如果需要终止宏的作用域,可以使用#undef命令,其一般格式为:
#undef 标识符
2宏定义可以嵌套定义但是不能递归定义。
3程序中字符串常量即双引号中的字符,不能作为宏进行宏替换操作。
4宏可以被重复定义
5在定义宏是如果宏是一个表达式,那么一定要将这个表达式用()括起来
带参数的宏(函数宏)
#define 标识符(参数列表) 单词串
参数表由一个或多个参数构成,参数只有参数名,没有数据类型符,参数之间用逗号隔开,参数名需是合法的标识符
单词串是宏的内容文本,也称为宏体,其中通常会引用宏的参数
带参数的宏与函数之间的区别。。。
文件包含
一个C语言源程序通过#include命令将另一个文件的全部内容包含进来。
预编译器是这样来处理#include命令的:将被包含文件的内容插入到源程序中#include命令的位置,一形成新的源程序。
使用算引号“ ”:系统首先到当前目录下查找被包含文件,如果没有找到,再到系统指定的“文件包含目录”去查找。#include "c:\prg\p1.h"在同文件中除可以包含宏定义外,还可以包含外部变量定义,结构定义类型等。
一条包含命令只能制定一个被包含文件。如果要包含N个文件,则需要N条包含命令。
文件包含可以嵌套,即被包含文件中又包含另一个文件。
条件编译
条件编译有几种常见的形式
1
#if … #endif
#if 条件1
程序段1
#elif 条件2
程序段2
.
.
.
#else
程序段n
#endif
if后面的条件必须是一个常量表达式
#if和#elif常常与defined命令配合使用,defined命令的格式为:
defined (宏名) 或 defined 宏名
其功能是判断某个宏是否已经定义,如果已经定义,defined命令返回1,否则返回0.defined命令只能与#if或#elif配合使用,不能单独使用。例如,#if defined(USA)的含义是“如果定义了宏USA”。
2
#ifdef … #endif
#ifdef 宏名
程序段 1
#else
程序段 2
#endif
“#ifdef 宏名"的含义是判断是否定义了宏,它等价于”#if defined (宏名)"
其作用是:如果宏名已被#define行定义了,则编译程序段1,否则编译程序段2
3
#ifndef … #endif
#ifndef 宏名
程序段 1
#else
程序段 2
#endif
条件编译与分支语句不能混为一谈,其区别为
(1)条件编译是在预编译时处理;而条件语句则是在程序运行时处理
(2)条件编译中的条件不可以包含变量名,只能是常量表达式(通常包括宏名),可以不加括号
(3)…
(4)条件编译可以放在所有函数的外部,也可以放在某函数的内部;分支语句只能出现在某函数的内部。
为什么要要使用条件编译
(1)便于程序的移植
(2)便于程序的调试,选择地输出临时结果