编译预处理----C语言

本文介绍了C语言中宏定义的两种形式(无参数宏和带参数宏),强调了它们在代码管理和效率提升上的应用,并讨论了文件包含处理,包括#include指令的使用和不同格式的区别。
摘要由CSDN通过智能技术生成

1 宏定义和调用(不带参数的宏,带参数的宏)

1.1 无参数的宏定义(宏常量)

如果在程序中大量使用到了100这个值,那么为了方便管理,我们可以将其定义为:

const int num = 100; 但是如果我们使用num定义一个数组,在不支持c99标准的编译器上是不支持的,因为num不是一个编译器常量,如果想得到了一个编译器常量,那么可以使用:

#define num 100

在编译预处理时,将程序中在该语句以后出现的所有的num都用100代替。这种方法使用户能以一个简单的名字代替一个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开。宏定义,只在宏定义的文件中起作用。

#define PI 3.1415

void test(){

double r = 10.0;

double s = PI * r * r;

printf("s = %lf\n", s);

}

说明:

  1. 宏名一般用大写,以便于与变量区别;
  2. 宏定义可以是常数、表达式等;
  3. 宏定义不作语法检查,只有在编译被宏展开后的源程序才会报错;
  4. 宏定义不是C语言,不在行末加分号;
  5. 宏名有效范围为从定义到本源文件结束;
  6. 可以用#undef命令终止宏定义的作用域;
  7. 在宏定义中,可以引用已定义的宏名;

1.2 带参数的宏定义(宏函数)

在项目中,经常把一些短小而又频繁使用的函数写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调高程序的效率。

宏通过使用参数,可以创建外形和作用都与函数类似地类函数宏(function-like macro). 宏的参数也用圆括号括起来。

#define SUM(x,y) ((x)+(y))

void test(){

//仅仅只是做文本替换 下例替换为 int ret = ((10)+(20));

//不进行计算

int ret = SUM(10, 20);

printf("ret:%d\n",ret);

}

注意:

  1. 宏的名字中不能有空格,但是在替换的字符串中可以有空格。ANSI C允许在参数列表中使用空格;
  2. 用括号括住每一个参数,并括住宏的整体定义。
  3. 用大写字母表示宏的函数名。
  4. 如果打算宏代替函数来加快程序运行速度。假如在程序中只使用一次宏对程序的运行时间没有太大提高。

2 文件包含处理

2.1 文件包含处理

“文件包含处理”是指一个源文件可以将另外一个文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。

2.2 #incude<>和#include""区别
  1. "" 表示系统在file1.c所在的当前目录找file1.h,如果找不到,按系统指定的目录检索。
  2. < > 表示系统直接按系统指定的目录检索。

注意:

1. #include <>常用于包含库函数的头文件;

2. #include ""常用于包含自定义的头文件;

3. 理论上#include可以包含任意格式的文件(.c .h等) ,但一般用于头文件的包含;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值