c语言核心语法之程序编译时第一步操作——预处理

c语言核心语法之程序编译时第一步操作——预处理

程序写好了,本质上只是一些文本文件,计算机是看不懂的,想要计算机按照我们写的逻辑去运行,就要对它进行编译,编译成可执行的二进制文件,这样计算机就懂了。

关于怎么快速学C/C++,可以加下小编的C/C++学习群:341+636+727,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,欢迎初学和进阶中的小伙伴。

每天晚上20:00都会开直播给大家分享C/C++游戏编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法,最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实

编译的第一步就是进行预处理,在这个过程中,主要处理三个方面:

  • 文件包含宏定义条件编译

一、 文件包含

文件包含,我想大家都不陌生,我们在之前的程序中曾很多次用到这个语句:

include<stdio.h> 即,包含标准输入输出函数库头文件。

文件包含的概念很好理解,在预处理时会将所包含的文件的内容,原封不动的放到include 出现的位置。

如有这样一个程序,有两个文件,main.c 和 calculate.h .

文件:main.c

#include<stdio.h>

#include"calculate.h"

int main()

{

int a, b;

a = 10;

b = 20;

printf("a + b = %d ", sum(a,b));

printf("the max number is %d ",max(a,b));

}

文件:calculate.h

#define sum(a, b) (a)+(b)

#define max(a, b) ((a) > (b) ? (a): (b))

在预处理的时候,会将#include"calculate.h"替换成 文件calculate.h中的内容,即:

#include<stdio.h>

#define sum(a, b) (a)+(b)

#define max(a, b) ((a) > (b) ? (a): (b))

int main()

{

int a, b;

a = 10;

b = 20;

printf("a + b = %d ", sum(a,b));

printf("the max number is %d ",max(a,b));

}

当然,#include<stdio.h> 语句在实际的预处理过程中,也会替换成相应的文件内容,此处由于篇幅原因就不再替换。

二、 宏定义

宏定义是一种,简单的文本替换操作,即相当于给一个变量、常量或者表达式起一个别称。

定义如下:

#define 名称 替换文本

例子:

#define π 3.14

就定义 π的值为3.14,在程序中凡是用到π的地方都代表数值3.14

还有上边文件calculate.h中的两个宏定义:

#define sum(a, b) (a)+(b)

#define max(a, b) ((a) > (b) ? (a): (b))

在main.c中经过预处理后,会变成:

int main()

{

int a, b;

a = 10;

b = 20;

printf("a + b = %d ", (a)+(b));

printf("the max number is %d ", ((a) > (b) ? (a): (b)));

}

即做简单的文本替换。

在使用宏定义的时候,有几个点需要注意一下:

1、一般情况下,#define 名称 替换文本 语句占一行,但如果替换文本很长需要占据多行,则需要在行尾加上一个反斜杠符号 以表示下一行的内容也是替换文本。

2、宏定义在预处理时对其进行文本替换,但是如果宏名称在引号中,则不会进行替换,如:

#define COUNTRY China

则在 printf(“COUNTRY”); 中因为 COUNTRY在引号中,不替换

3、在用宏定义表示一些带有计算性质的表达式时,最好用圆括号将参数括起来,以免引起错误。

#define squ(x) x*x

当squ(a+b) 时,进行替换后变成: a+b*a+b ,显然计算的结果跟我们预期的不符。

而如果:#define squ(x) (x)*(x) ,

则squ(a+b) 进行替换后为:(a+b)*(a+b), 显然这样才是正确的。

三、 条件编译

条件编译主要是用来解决两个问题:

1、避免重复包含某个文件

如:

#ifndef CAL

#define CAL

/*cal.h文件的内容放到这里*/

#endif

2、根据系统情况,选择性的编译相对应的代码

#if SYSTEM == SYSV

#define HDR “sysv.h”

#elif SYSTEM == BSD

#define HDR “bsd.h”

#else

#define HDR “msdos.h”

#endif

注释:

#if 相当于 if的作用

#elif 相当于 else if 的作用

#ifdef 代表:如果定义了某个宏,则…

#ifndef 代表: 如果没有定义某个宏,则…

最后注意一点,条件编译需要 #endif来结尾。

猜你喜欢

转载自blog.csdn.net/chengxuyuan997/article/details/81256667