c的编译预处理包括哪些内容(C语言预编译处理)

1 编译预处理

C编程语言编写的源码需要经过“编译”,转换成操作系统可以执行的可执行文件。那么,在编译的过程中,就存在一个“预处理”的过程。

例如,在做菜的过程中,在炒菜之前先洗菜;那么,“洗菜”就是一个预处理的过程。那么,C语言提供了预处理的语法,例如条件编译、宏定义等等,都非常有利于程序的扩展,提高代码的扩展性、可移植性。假设我们要开发一个程序,编写的代码需要兼容在windows系统和linux系统下编译运行。那么,在涉及到操作系统相关的代码时,可以使用如下的框架:

#ifdef WIN32

代码A //编写windows操作系统相关代码;

#else

代码B //编写linux操作系统相关代码;

#endif

那么,在代码中,如果我们定义了WIN32宏,编译器在编译上面的代码时,就编译代码A,在代码A中编写与windows操作系统相关的代码;如果没有定义WIN32宏,就编译代码B,在代码B中编写与linux操作系统相关的代码。

所以,通过控制是否定义WIN32宏,就可以控制编译windows系统下的代码或者linux系统下的代码。

其中#ifdef, #else等语法,就是C语言提供的预处理语法。下面我们就介绍C语言常用的预处理方法。

2 无参宏定义

在介绍常量符号的时候,我们定义一个常量符号的格式如下:

#define 常量符号 常量值

此时,可以把“常量符号”称为:宏;那么常量符号的定义称为:宏定义。其中,常量值可以是字符串、表达式、常数值等等。

注意:定义宏的时候,在行的末尾,不需要使用分号“;”结束。如果添加了分号,那么,分号就作为常量值的一部分,在预处理的时候,分号作为常量值的一部分一起替换宏名。

那么,编译器在预处理的过程中,把代码中所有出现常量符号的地方,都使用其对应的常量值替换。例如:

#define MAX 1000

此时,定义常量符号MAX,它代表1000这个数值。那么,有如下的代码:

int a = MAX 99;

那么,在编译预处理的时候,就把MAX这个符号常量替换为1000数值。所以,代码就转换为:

int a = 1000 99;

在代码中,使用宏定义有一定的好处,如下:

(1) 给常量命名,能够直观地表达该常量值的作用。例如,我们要定义一组数据的最大值,可以定义:

#define MAX_VALUE 1000

此时,MAX_VALUE符号常量就表示一组数据的最大值。从名称来看,就是一个最大值的定义。

(2) 可以批量修改某个常量值。假如在代码中有300处地方使用了MAX_VALUE这个符号常量,某一天,系统需求有改动,数据的最大值变为500,那么,不用修改300处引用最大值的地方,只需要修改MAX_VALUE的定义就可以了。

所以,合理地使用宏定义,可以提高代码的扩展性和移植性。如下是一个程序测试例子:

c的编译预处理包括哪些内容(C语言预编译处理)(1)

程序运行结果如下:

c的编译预处理包括哪些内容(C语言预编译处理)(2)

可以看到,我们定义了STR_LEN、STR、EXP这样的宏。在代码进行编译预处理的时候,就把代码中,使用宏的地方,替换为宏定义的值。例如:

num = EXP 3;

这样的语句就使用 EXP宏的值进行替换,最终得到的代码是:

num = (1 2 3) 3; //最终计算出 num 为9数值

所以,宏定义就是一个替换的操作。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页