1、宏定义
宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制。
宏定义指令#define用来定义一个标识符和一个字符串,一这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。宏定义的作用相当于给指定的字符串起一个别名。
1)不带参数的宏定义一般形式如下:
#define 宏名 字符串
说明:
(1)#表示这是一条预处理命令。
(2)宏名是一个标识符,必须符合C语言标识符规定
(3)字符串这里可以使常数、表达式、格式字符串等。
(4)
宏定义不是c语句,不需要在行末加分号
(5)如果在串中含有宏名,则不进行替换。
(6)如果串长于一行,可以在该行末尾用用一反斜杠“\”续航
(7)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到此源文件结束
(8)可以用#undef命令终止宏定义的作用域
(9)宏定义用于预处理命令,它不同于定义的变量,只作字符串替换,不分配内存空间。
2)带参数的宏定义
带参数的宏定义不是简单的字符串替换,还要进行参数替换,其一般形式如下:
#define 宏名(参数表)字符串
如:#define MIX(a,b) ((a)*(b)+(b))
说明:
(1)宏定义时参数要加括号,如不加括号,则有时结果是正确的,有时结果是不正确的。
(2)宏扩展必须使用括号来保护表达式中低优先级的操作符,以确保调用时达到想要的结果。
2、#include 指令
在一个源文件中使用#include指令可以将另一个源文件的全部内容包含进来,也就是将另外的文件包含到本文件中。#include使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:
#include"stdio.h"
#include<stdio.h>
这两种方式的区别:
用尖括号时,系统到存放C库函数头文件所在的目录中寻找要包含的文件,这是标准方式。用双引号时,系统先在用户当前目录中寻找要包含的头文件,若找不到,再到存放头文件所在的目录寻找要包含的文件。通常情况下,
如果要调用库函数用#include"_”如果要包含用户自己编写的文件,一般用双引号#include<_>。
经常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,一般以.h为后缀。
一般情况下将如下内容放到.h文件中:
(1)宏定义。
(2)
结构、联合和枚举声明。
(3)typedef声明
(4)外部函数声明
(5)全局变量声明
3、条件编译
(1)#if命令
#if的基本含义是:如果#if命令后的参数表达式为真,则编译#if到#endif之间的程序段,否则跳过这段程序。
#if命令的一般形式为:
#if 常数表达式
语句段
#endif
#elif指令用来建立一种“如果。。。或者如果。。”这样阶梯状多重编译操作选择,这与多分支if语句中的else if类似。
#elif的一般形式如下:
#if 表达式
语句段
#elif 表达式1
语句段
#elif 表达式2
语句段
。。。
#elif 表达式n
语句段
#endif
(2)#ifdef及#ifndef命令
不需要判断具体值,只需要知道这个符号常量是否被定义了,则采用#ifdef与#ifndef命令,分别表示“如果有定义”及“如果无定义”。
1)#ifdef的一般形式:
#ifdef 宏替换名
语句段1
#else
语句段2
#endif
其含义是:如果宏替换名已被定义过,则对“语句段”进行编译;如果未定义#ifdef后面的宏替换名,则对“语句段2”进行编译。
2)
#ifndef的一般形式:
#ifndef 宏替换名
语句段1
#else
语句段2
#endif
其含义是:如果未定义#ifndef后面的红替换名,则对“语句段1”进行编译;如果定义#ifndef后面的宏替换名,则对“语句段2”进行编译。
(3)#undef命令
使用#undef命令可以删除事先定义了的宏定义。
#undef命令的一般形式如下:
#undef 宏替换名
#undef的主要目的是将宏名局限在仅需要他们的代码段中
(4)#line命令
#line命令改变_LINE_与_FILE_的内容,_LINE_存放当前编译行的行号,_FILE_存放当前编译的文件名。
#line命令的一般形式如下:
#line 行号["文件名"]
其中,行号为任一正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的额名字。#line命令主要用于调试及其他特殊应用。
(5)#pragma命令
#pragma命令的作用是设定编译器的状态,或者指示编译器完成一些特定的动作。
#pragma命令的一般形式为:
#pragma 参数
参数可以为以下几种:
1)message参数能够在编译信息输出窗口中输出的相应信息
2)code_seg参数设置程序中函数代码存放的代码段
3)once参数保证头文件被编译一次
(6)预定义宏名
ANSI标准说明了以下5个预定义宏替换名
1)_LINE_:其含义是当前被编译代码的行号
2)_FINE_:其含义是当前源程序的文件名称
3)_DATE_:其含义是当前源程序的创建日期
4)_TIME_:其含义是当前源程序的创建时间
5)_STDC_:其含义是用来判断当前编译器是否为标准C,若其值为1则表示符合标准C,否则不是标准C.