C语言预处理

一、预处理概述

1、编码时,我们多次使用过#include命令,在使用库函数之前,应该使用#include引入对应的头文件,这种以#号开头的命令称之为预处理命令。

2、C语言中提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理使用预处理功能编写程序便于阅读、修改、移植和调试,并且有利于模块化程序设计。

二、宏定义

1、C语言源程序中允许用一个标识符来表示一个字符串,称为‘宏’。被定义为‘宏’的标识符称为‘宏名’。

2、编译预处理时对程序中所有出现的“宏名”,都用宏定义中的字符串去进行文本替换,这称为“宏代换”或者“宏展开”。

三、无参宏定义

1、无参宏的宏名后不带参数

一般形式为:

#define 标识符 字符串

注意:“字符串”可以是常量、表达式

2、举例

#define PI 3.14

#define EXP x*10*15

编译器在预处理时,会将源程序中所有的“PI”替换成“3.14”,将所有的EXP,替换成表达式“x*10*1.5”。

#include <stdio.h>

#define PI 3.14
#define EXP x*10*1.5

int main()
{
    float f;
    f = 10*PI;
    
    float f2;
    f2 = 10*EXP;
    return 0;
}

3、在刚才的代码中,宏定义中出现了x,但是我们在使用时却没有定义x变量,预处理还是能够顺利通过,思考一下这是为什么?

答:宏定义是简单的文本替换,不会做语法检查。

四、有参宏定义

1、C语言允许宏带有参数,但是在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。

2、带参数的宏,在调用中,不仅仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define 宏名(形参表)字符串

//使用方法

include <stdio.h>

#define F(x) x*x*x

int main()
{
    int r = F(3);
    return 0;
}

 五、宏定义注意事项

1、宏定义的“字符串”如果是表达式,表达式中的变量需要用()包含起来,因为在预处理阶段展开宏时,可能会用表达式来替换宏定义中的变量。

#include <stdio.h>

#define F(x) (x)*(x)*(x)

int main()
{
    F(1+2);
    return 0;
}

上面的例子中展开后,(1+2)*(1+2)*(1+2),如果不加()呢?展开的表达式就变成这样了,1+2*1+2*1+2*1+2,这显然不是我们想要的结果。

六、文件包含

1、前面的学习中我们已经使用了C语言的文件包含命令,例如:#include <stdio.h>,文件包含语法格式如下:

#include <文件名>
#include "文件名"

注意:

1、使用尖括号表示在开发环境的头文件目录下查找,而不在源文件目录去查找

2、使用双引号则表示首先在当前的源文件目录中查找,如果没有找到才到包含目录中去查找

3、“文件名” 可以是相对路径,也可以是绝对路径,建议不要使用绝对路径

六、条件编译

1、常用的条件编译指令 

 2、ifdef 作用

ifdef的功能是,如果标识符已被 #define 命令定义过则该程序段1进行编译;否则对程序段2进行编译,如果程序段2(为空),本格式中的 #else 可以没有。

#ifdef 标识符
    程序段1
#else
    程序段2
#endif

3、#if 作用

用于对代码进行注释

#if()
   代码块
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值