c语言预处理程序有三种,分别是:函数
1.包含头文件,如:#include <stdio.h>spa
2.宏定义(本质是字符串的替换) 指针
如 :#define 宏名 串(宏体)调试
#define PI 3.14159作用域
#undef 终止宏定义的做用域字符串
如:#undef PI 原型
注:双引号内与宏同名的字符串不作宏体展开io
#define R 3.0 编译
#define PI 3.14159变量
#define L 2*PI*R /*宏体是表达式*/
注:引用宏只占编译时间,不占运行时间。
引用宏没有返回值。
带参数的宏定义的通常形式:
#define 宏名(参数表) 字符串
如:#define S(a,b) a*b /* 对宏定义来讲参数不须要指明类型 */
3.条件编译(一般在程序调试中)
#if 常量表达式(为非零值时执行程序段,为0时不执行)
程序段(通常是要调试的程序段)
#endif
#ifdef 标识符
程序段一
#else
程序段二
#endif
功能:标识符以前已经定义,则编译程序段一,不然执行程序段二
c语言预处理关键字:
#define #undef #include #if #ifdef
#ifndef #else #endif #line
(注意:#前面不能留空格)
1.包含文件(include)
#include “文件名”通常文件
#inlcude <文件名>系统文件
编译程序以该文件名的内容来替换该控制行,一般在每一个源文件开头出现这样的行,是为了包含公共的#define和全程变量的说明以及函数原型。
使用#include可把其它文件(每每是.h文件)的内容包含进来,#include还容许嵌套使用,如:
使用#include的优势
能够把全部公共的、须要给程序各个函数共享的外部变量说明、函数原型和宏定义、类型定义等都放在某一文件上(一般以.h为文件后缀)。其它文件的开头只须用一条#include “该.h”文件的语句,就能够省去重写这些说明、定义的麻烦,并且程序结构更为清晰。如:
#include <stdio.h>
#include <math.h>
#include “local.h”
2.宏定义
格式:
#define标识符单词串
编译程序用单词串来替换#define后出现的该标识符。宏定义一般有两种用途:
1)定义常量
如:
#define YES1
#define EOF-1
又如:
#define:==
#definethen
#definebegin{
#defineend;}
则能够写出Pascal风格的C程序:
if( i > 0) then
begin
a := 1; b:=2;
end
宏替换不只对常量定义有价值,使程序增长可读性,并且许多函数均可以经过宏替换来表示,没必要进行频繁的函数调用,但宏替换占有空间比函数大。
宏定义函数与普通函数的区别:
实现上,宏函数将相应串替换到函数中,而函数只需提供一个指向其实现代码的指针。
通常只将相对比较简单的函数用宏实现,其速度要比函数快,但占用更多的存贮间。
取消宏定义:#undef YES
3.条件编译
C语言预处理程序提供了根据条件对程序段进行有选择地编译的能力,而这些控制行自己不参加编译。
条件编译形式以下:
#if 常量表达式
#ifdef 标识符
#ifndef 标识符
如:
#if 常量表达式
程序段1 --常量表达式为真时编译
#else
程序段2 --常量表达式为假时编译
#endif
又如:
#ifdefYES
…--YES 已定义时编译
#else
…--YES 未定义时编译
#endif
咱们常常可在一些头文件中见到下面语句:
#ifndef _ _THIS
#define _ _THIS
…
#endif
可用它们来避免该头文件被重复包含。
4.行控制
格式:
#line 常量[标识符]
常量 –给定行号标识符 –命名当前的输入文件名提示编译程序自下行开始的源程序给出该行号。