C语言的预处理指令只在编译程序时发生作用:由预处理器根据预处理指令对程序代码做相应的修改,比如在原程序中添加某一段代码或者定义一些常量等。
预处理指令以符号“#”开头,C语言常用的预处理指令包括:
#include //包含文件 #define //定义常量
#include 指令是一个文件合并命令,程序在编译时,#include 语句会被 #include 后面的文件内容替换(见图 1 )。
#include 指令一般有两种格式,二者功能几乎等价:
#include <filename> //包含 C语言标准库头文件 #include "filename" //包含用户自定义头文件
当你安装 C语言编译器时,安装程序会在硬盘中创建一个目录,里面存放着一些包含有 C语言的内置函数和符号的文件,通常称这些文件为 C语言的标准库头文件(header file),头文件的扩展名以“.h”结束。表 1 列举了 C语言中常用的内置函数及其所属头文件。
C 函数 | 说明 | 头文件 | C 函数 | 说明 | 头文件 |
---|---|---|---|---|---|
printf( ) | 输出到屏幕 | STDIO.H | sysytem( ) | 执行 DOS 命令 | STDLIB.H |
scanf( ) | 输入数据 | STDIO.H | exit( ) | 退出程序 | STDLIB.H |
putchar( ) | 输出一个字符到屏幕 | STDIO.H | rand( ) | 返回一个随机数 | STDLIB.H |
getchar( ) | 输入一个缓存字符 | STDIO.H | sqrt( ) | 返回平方根 | MATH.H |
putch( ) | 输出一个字符 | CONIO.H | fabs( ) | 返回绝对值 | MATH.H |
getch( ) | 输入一个不缓存字符 | CONIO.H | ceil( ) | 上舍入取整 | MATH.H |
puts( ) | 输出一个字符串 | STRING.H | floor( ) | 下舍入取整 | MATH.H |
gets( ) | 输入一个字符串 | STRING.H | fopen( ) | 打开一个文件 | STDIO.H |
strcpy( ) | 把字符串赋值给变量 | STRING.H | fclose( ) | 关闭文件 | STDIO.H |
strcat( ) | 连接两个字符串 | STRING.H | feof( ) | 是否为文件结尾 | STDIO.H |
toupper( ) | 把一个字母转化为大写 | CTYPE.H | fgetc( ) | 从文件中读取一个字符 | STDIO.H |
tolower( ) | 把一个字母转化为小写 | CTYPE.H | fgets( ) | 从文件中读取字符串 | STDIO.H |
isalpha( ) | 是否是字母 | CTYPE.H | fprintf( ) | 输出到文件中 | STDIO.H |
isdigit( ) | 是否是数字 | CTYPE.H | fputc( ) | 把一个字符写到文件中 | STDIO.H |
issupper( ) | 是否是大写字母 | CTYPE.H | fputs( ) | 把字符串写到文件中 | STDIO.H |
islower( ) | 是否是小写字母 | CTYPE.H | fseek( ) | 定位到文件指定部分 | STDIO.H |
用#include<filename>包含标准库头文件时一般都不需要带路径;而用#include"filename"包含非标准库头文件(用户自定义的头文件)时,如果文件不是保存在程序所在根目录下,则必须包含路径名。比如:
#include <stdio.h> //包含标准库头文件不需要带路径 #include "mylib.h" //包含存放在程序根目录下的自定义头文件 #include "c:\\mylib\\mylib.h" //包含存放在 c:\mylib\ 的自定义头文件
#define 预处理指令用来定义常量。用 #define 定义的常量使用(调用)方法和变量一样,但它们不是变量,不能像变量一样被赋值,在程序运行中它们的值始终保持不变。#define 指令的格式如下:
#define <符号常量名> <常量值> //符号常量名一般大写 例如: #define PI 3.14159 //定义常量 PI 的值为 3.14159 #define MYNAME "王小石" //定义常量 MYNAME 的值为“王小石”
在程序编译时,程序中所有的 PI 都会被 3.14159 替换,所有的 MYNAME 都会被“王小石”替换(见图 1 )。