C 语言复习与提高--- VI. 编译预处理

本文详细介绍了C语言的编译预处理,包括标准预处理指令如#define、#include等,强调了预处理指令的书写规则和习惯,以及宏定义和文件包含的使用注意事项。此外,还探讨了条件编译在提升软件适应性和可移植性方面的重要性。
摘要由CSDN通过智能技术生成
VI. 编译预处理

编译预处理是指在对程序进行编译之前所做的预加工处理,此工作在对每一个程序进行编译时都自动进行。

一、ANSI C 定义的标准预处理指令:

#if

#ifdef

#ifndef

#else

#elif

#endif

#define

#undef

#line

#error

#pragma

#include

预处理器处理的对象是预处理指令(preprocessor directives),输出是“翻译单元”(是存放在内存中的临时文件)。

编译器接受预处理器的输出,并把源代码转换成包含机器语言指令的目标文件。

二、书写规定与习惯:

1、每条指令必须单独占用一行。

2、每行末尾不加 ;(因为不是语句)。

3、一般使用全部大写来表示标识符。如: #define LANGUAGE chinese

4、一个预处理指令可以写在程序中的任何位置。通过合理地使用这些指令,可以提高程序的可读性和可移植性。

三、关于 #define 的一些说明:

1、宏中的参数只原样替换,并不求值,而函数的参数则不然。

2、宏中的参数不会被分配内存空间。

3、宏只占用编译时间,而不占用运行时间,但函数则相反。

4、宏被替换后,可能使代码加长,而函数则不会。使用函数的一个主要目的就是是代码可以重用,起到简化代码的作用。

5、宏比函数具有更好的数据类型的适应性(因为它没有参数类型的要求)。

6、宏不能递归调用。

使用类函数宏代替函数的一个主要的优点是能够提高代码的速度(消除了调用的开销)。但是,若类函数宏的尺寸非常大,则会因为复制代码而增加了程序的规模。所以,在 C99 和 C++ 中,定义了 inline 关键字,使程序员能够更好地定义内联代码。

四、关于 #include 的一些说明:

1、文件包含是一种模块化程序的手段,有助于代码的重用。

2、习惯:程序员可将经常使用的常量(宏定义)、多个源文件共同使用的全局变量、函数声明等写成一个或分类写成多个文件,在需要时,可以用 #include 将它(们)包含进来。

3、包含文件中允许嵌套包含(可以包含其它 #include 指令)。允许的最大嵌套深度随编译器的不同而不同。C89 规定编译器最少应能处理 8 层嵌套包含,C99 提升到 15 层。

五、关于条件编译的一些说明:

1、条件编译是为了使商业软件具有更广泛的适应性(或可移植性)而提供的功能。

2、C89 规定,#if -- #elif、#ifdef 和 #ifndef 的嵌套深度最少为 8 层,C99 提升至 63 层。

3、[实例1] #ifdef IBM-PC #define INTSIZE 2 #else #define INTSIZE 4 #endif

[实例2]符号 NULL 在 6 个不同的文件中都有定义:locate.h、stddef.h、stdio.h、stdlib.h、string.h、time.h。一个源文件可能包含其中的几个头文件,这样会使编译器报错。这时需要在每个头文件中使用条件编译: #ifndef NULL #define NULL ((void *)0) #endif

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值