c++预处理命令

                            C预处理命令

一.什么是预处理命令

  简单的说,预处理就是为了提高编程效率,在对程序编译之前,注意是编译之前了,根据预处理命令进行相应的处理。预处理命令包括:#define#include#ifdef#endef,d等。例如:用#define命令定义一个符号常量A,则在预处理时,就会对本文件中所有的A置换为指定的字符串。

经过预处理后,程序就不再包含预处理语句了。然后再进行通常的编译处理了。这也是c语言与其他语言的重要区别。

C语言提供的预处理功能主要有以下三种:

1.       宏定义

2.       文件包含

3.       条件编译

这些功能都是由预处理命令来实现,一般为了区别c语句,这些命令以符号#开头。

二.具体的预处理命令

一.宏定义

宏定义说白了就是定义一个标示符代表全局变量,或者语句。在以后遇见了这个标示符,程序就会把它替换成相应的变量或语句。

例如:

#define PI 3.1415926

#include<stdio.h>

Int main()

{

Printf(“%f”,PI);

}

这时程序就会输出3.1415926

宏定义又大致的分为:不带参数的宏定义,带参数的宏定义两种:

A.      不带参数的宏定义:

# define 标示符字符串

例如上例中的 #define PI 3.1415926。在预编译是将宏名替换成字符串成为宏展开”,#define 命令时宏定义命令,PI就是宏名,也是标示符的意思。

说明:

(1)       宏定义一般习惯用大写字母表示,方便识别

(2)       使用宏名代替一个字符串,可以减少书写某些字符串的工作量,而且修改字符串也变得方便,置换起来只需要修改宏名代替的那个字符串就可以了。

(3)       宏定义不是c语言,不需要加;

(4)       #define命令出现在程序函数外面,有效范围是本文件。

(5)       可以使用#undef 命令手动终止宏的作用域。

例如:

#include<stdio.h>

#define PI 3.1415926

int main()

{

     printf("%f",PI);

                                 return 0;

}

#undef PI

int fundef()

{

     return PI;

}

这时候后面的函数编译时就会报错,说PI变量没有声明。

(6)       在进行宏定义是,可以引用已定义的宏名,层层置换。

还是举个例子吧:

例如:

#define PI 3.1415926

#define R 2

#define L 2*PI*R

#define S PI*R*R

这个就是引用已定义的宏,实现置换。

(7)       如果程序中有双括号括到的字符串与宏名相同,程序是不会进行置换的,由于宏定义是一个专有名词,而且不参与程序的编译,所以不分配内存空间。

1.       带参数的宏定义

带参数的宏定义简而言之,就是宏定义中出现了参数,一般形式是:

#define 宏名(参数)字符串

例如:

#define S(a,b) a*b

 

说明:

(1)       对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符代替#define命令行中的形参。

(2)       在宏定义时,宏名与参数之间不要加空格。

(3)       预定义中的宏参数不许要定义类型,因为只是替换

(4)       调用函数只能得到一个返回值,而宏可以得到几个结果

例如:

#define CIRCLE(r,L,S,V) L=2*PI*r;S=PI*r*r;V=4/3*PI*r*r*r

 

float r,l,s,v;

  scanf("%f",&r);

  CIRCLE(r,l,s,v);

  printf("圆形周长是:%f\n",l);

  printf("面积%f\n",s);

printf("体积%f\n",v);

(5)       宏展开时,每次都会替换,所以使用带参数的宏定义,会使得程序变长,相对函数而言。但是宏替换不占用运行时间,只占编译时间,而函数调用则要占用运行时间(包括分配单元,保护现场,值传递,返回等)

二.文件包含处理

文件包含处理就是指一个源文件可以将另外一个源文件的全部内容包含进来,这样就可以使用另一个文件中的内容。c语言提供了#include的命令来实现。

一般形式:

#include”文件名”-----多用于自定义的文件

#include <文件名>多用于系统定义的文件。

例如:

   我们的输出语句中#include<stdio.h>中预定义的带参数的宏

就是一个系统定义好的类库,包含输入输出的语句

说明:

(1)       一个#include命令只能包含一个文件

(2)       #include命令可以传递,也就是说如果有三个文件。File1.c file2.c file3.c 加入file12.c文件中包含file1.c ,file3.c又包含file2.c,那么file3.c同样包含了file1.c

(3)       被包含文件与其所在文件,在编译后成为统一个文件。

 

三.条件编译

一般情况下,源程序素有行都要参见编译,但是有时候希望程序中的一部分内容只在满足一定条件下才进行编译,也就是对这一部分内容指定编译条件,就是“条件编译“

条件编译命令形式:

(1)       #ifdef 标示符

程序段1

Else

程序段2

#endef

含义:如果标示符已经定义,就编译程序段1,否则编译程序段2

(2)       #ifdef 标示符

程序段1

#endef

含义:如果标示符已经定义,编译程序段1

说明:

使用条件编译完全可以使用if来代替,而之所以采用条件编译,是因为使用if所有语句都要编译,对if要进行判断,运行时间长,而使用条件编译,可以减少编译的语句,减少程序长度和运行时间。

 

最后除了这些预编译外,还有#pragma等比较复杂的预编译命令。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值