设为首页 加入收藏

TOP

C语言之预处理命令
2014-11-23 19:05:14 来源: 作者: 【 】 浏览:14
Tags:语言 处理 命令

1.前沿

ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高 编程效率。这些预处理命令不是C语言本身的组成部分,不能直接对它们进行编译。先要对程序中的这些特殊的命令进行“预处理”,经过预处理后的程序不在包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
C提供的预处理功能主要有以下3种: 1.宏定义 2.文件包含 3.条件编译 分别用宏定义命令、文件包含命令、条件编译命令来实现,这些命令以“#”开头。

2.宏定义

2.1不带参数的宏定义

用一个指定的标识符来代表一个字符串,一般形式: #define 标识符 字符串 例子:
#define PI 3.14

说明:

他的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串。在预处理时,将程序中在该命令出现后的所有的PI都用“3.1415926”;我们把这些标识符称为“宏名”。一般的,宏名习惯用大写表示,以便与变量名相区别。其次,宏定义是在预编译时不作正确性检查。最后,宏定义不是C语句,不必在行末在分号,如果添加了则会连分号一起进行置换,极易出错。

例子:

#define  PI 3.14;
     ...
area = 3.14*r*r;

宏展开,语句为
area = 3.14;*r*r;//语法错误

2.2带参数的宏定义

带参数的宏定义不是进行简单的字符串替换,还要进行参数替换,一般形式: #define 宏名(参数表) 字符串 例子:
//定义矩形面积S,a和b是变长
#define S(a,b) a*b
    ...
area = S(3,2);
展开过程: 在程序中如果带有实参的宏(如S(3,2))则按#define命令行中指定的字符串从左到右进行置换。如果串中包含形参(形如a、b),则将相应的实参代替形参。如果字符串中的字符不是参数字符(形如*)则保留。替换过程如下图
\

因此赋值语句展开为
area = 3*2;
例子:

#define PI 3.14
#define S(r) PI*(r)*(r)

int _tmain(int argc, _TCHAR* argv[])
{
	float a, area;
	a = 2;
	area = S(a+1);//展开3.14*(a+1)*(a+1)
	printf("r=%.2f,area=%.2f\n",a,area);
}

运行结果:
r=2.0,area=28.26
注意:在宏名与带参数的括号之间不应加空格,否则会变成不带参数的宏定义,容易出错; 例子:
#define S (r) 3.14*(r)*(r)
        。。。
area = S(a+1);//展开3.14*(r)*(r)(a+1)


3.文件包含

所谓的“文件包含”是指一个源文件可以将另外一个源文件的内容全部包含到本文件中, c语言提供#include命令用来实现文件包含,一般形式:
#include<文件名> (一般是库文件) #include”文件名“ (用户自定义文件)
下图形象的展示了文件包含
\

4.条件编译

一般情况下,源程序中所有的行都要参加编译,但有时候只希望在满足一定条件下才进行编译,这就是“条件编译”。可以在满足某条件时编译一组语句,而当不满足条件时编译另外一组语句。 条件编译的几种形式:

(1)如果定义“标识符”则执行“程序段1”

#ifdef 标识符< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICAgs8zQ8rbOMTwvcD4KPHA+ICAgICAjZW5kaWY8L3A+CjxwPsD919M6PC9wPgo8YmxvY2txdW90ZT4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#ifdef COMPUTER_A #define INTEGER_SIZE 16 #endif

(2)如果定义“标识符”执行“程序段1”,否则执行“程序段2”

#ifdef 标识符

程序段1

#else

程序段2

#endif

例子:

#ifdef COMPUTER_A
     #define  INTEGER_SIZE 16
#else
     #define  INTEGER_SIZE 32
#endif

(3)如果没定义“标识符”则执行“程序段1”

#ifndef 标识符

程序段1

#endif

(4)如果“真”执行 “程序段1”否则执行“ 程序段2”

#if 表达式

程序段1

#else

程序段2

#endif

总结:预编译功能是C语言特有的,有利于程序的可移植性,增加程序的灵活性
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言实现strcmp()和strcpy()函数 下一篇[C解析之八] 动态内存管理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: