首页 > 编程语言 > 详细

C语言三)预处理指令

时间:2015-02-05 11:21:05      阅读:246      评论:0      收藏:0      [点我收藏+]

一、预处理指令

1.定义

C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,如:#include,产生一个新的源程序,这个过程称为“编译预处理”,之后再进行通常的编译工作。

2.作用范围

预处理指令可以出现在程序的任意位置,它的作用范围是从它出现的位置到文件末尾。习惯上,我们把预处理指令写在源程序开头。

3.类型

C语言提供了预处理指令主要有:宏定义、文件包含和条件编译。


二、不带参数的宏定义

1.一般形式

#define 宏名 字符串

如:#define A 10;

// 源程序中所有的宏名PI在编译预处理的时候都会被3.14所代替
#define PI 3.14
// 根据圆的半径计radius算周长
float girth(float radius) {
    return 2 * PI *radius;
}
int main ()
{
    float g = girth(2);
    printf("周长为:%f", g);
    return 0;
}


2.作用

在编译预处理的时候,将源程序中所有“宏名”替换成右边的字符串,常用来定义常量。

3.注意

1)宏名一般用大写字母,以便和变量名进行区别。

2)对程序中双引号括起来的字符串内的字符,不能进行宏的替换操作。

#define R 10
int main ()
{
    char *s = "Radio"; //这里有R,但是不会替换
    return 0;
}

3)在进行宏的替换操作时,不做语法的检查,只是简单的替换操作而已。只有在替换完后的下一步编译操作,才会进行语法检查。因此,如果有错误,也只会在编译的时候产生。

4)宏名的有效范围默认是从定义位置到文件末尾,如果想终止的话,可以使用“#undef 宏名“,这样,宏名的有效范围就缩减至终止操作的位置。

5)定义宏时,可以使用已经定义过的宏名。

#define R  3.0
#define PI 3.14
#define L  2*PI*R
#define S  PI*R*R

三、带参数的宏定义

1.一般形式

#define 宏名(参数列表) 字符串

2.作用

在编译预处理的时候,将源程序中的宏名替换成字符串,并将字符串中的参数用源程序中的宏名的实际数值代替。

3.注意

1)宏名和参数列表之间不能有空格。

2)定义宏时,参数列表有"()"括起来,字符串的参数也用"()"括起来

#include <stdio.h>
#define D(a) 2*a
int main ()
{
    int b = D(3+4);
    
    printf("%d", b);
    return 0;
}
//2*3+4
//输出结果:10
#include <stdio.h>
#define D(a) 2*(a)
int main ()
{
    int b = D(3+4);
    
    printf("%d", b);
    return 0;
}
//2*(3+4)
//输出结果:14

3)计算结果也用”()“括起来

#include <stdio.h>
#define Pow(a) (a) * (a)
int main(int argc, const char * argv[]) {
    int b = Pow(10) / Pow(2);
    
    printf("%d", b);
    return 0;
}
//10*10/2*2=100
//输出结果:100
#include <stdio.h>
#define Pow(a) ((a) * (a))
int main(int argc, const char * argv[]) {
    int b = Pow(10) / Pow(2);
    
    printf("%d", b);
    return 0;
}
//(10*10)/(2*2)=25
//输出结果:25


4.宏与函数的区别

虽然带参数的宏定义和函数十分相似,但是还是有本质的区别:

1)宏定义不涉及存储空间的分配、参数类型分配、参数传递、返回值的问题。

2)函数在程序运行时执行,而宏替换在编译预处理时执行。所以带参数的宏比函数效率更高。
















C语言三)预处理指令

原文:http://blog.csdn.net/z18789231876/article/details/43524487

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!