c语言条件编译及编译预处理阶段

c语言条件编译及编译预处理阶段

ID:15400295

大小:51.50 KB

页数:6页

时间:2018-08-03

c语言条件编译及编译预处理阶段_第1页
c语言条件编译及编译预处理阶段_第2页
c语言条件编译及编译预处理阶段_第3页
c语言条件编译及编译预处理阶段_第4页
c语言条件编译及编译预处理阶段_第5页
资源描述:

《c语言条件编译及编译预处理阶段》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C语言条件编译及编译预处理阶段一、C语言由源代码生成的各阶段如下:C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件其中编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为

2、它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。二、伪指令(或预处理指令)定义预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件

3、为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是elseif的简写#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息三、预处理指令主要包括以下四个方面:1、宏定义指令宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用,但它是在

4、调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。1.1#define指令1.1.1#define预处理指令用来定义宏。该指令最简单的格式是:声明一个标识符,给出这个标识符代表的代码(比如像圆周率这样的数)。在后面的源代码中,我们就可以使用定义的宏取代要使用的代码,举例如下://例1#defineMAX_NUM10intarray[MAX_NUM];for(i=0;i

5、作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。1.1.2使用宏的好处有两点:一是使用方便。如下://例2#definePAI3.1415926PAI显然比3.1415926写着方便。二是定义的宏有了意义,可读性强。如例1,MAX_NUM,望文生意便知是最大数量的意思,比单纯使用10这个数字可读性要强的多。三是容易修改。如例1,如果在程序中有几十次会使用到MAX_NUM,修改只需要在宏定义里面修改一次就可以,否则你会修改到崩溃。1.1.

6、3宏表示的值可以是一个常量表达式,允许宏嵌套(必须在前面已定义)。例如://例3#defineONE1#defineTWO2#defineSUM(ONE+TWO)这里需要注意两点:一是注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考虑,还是应该加上括号的。例如:six=THREE*TWO;预处理过程把上面的一行代码转换成:six=(ONE+TWO)*TWO;如果没有那个括号,就转换成:six=ONE+TWO*TWO;了。也就是说预处理仅是简单的字符替换,要时刻注意这一点,很多错误都会因此出现。二是虽然我们举例用了#defineON

7、E1这个例子,但是一般要求宏定义要有其实际意义,#defineONE1这种没意义的宏定义是不推荐的。(大概是这么个意思,忘记具体怎么说了)1.1.4宏还可以代表一个字符串常量,例如:#defineVERSION"Version1.0Copyright(c)2003"1.2带参数的#define指令(宏函数)带参数的宏和函数调用看起来有些相似。看一个例子://例4#defineCube(x)(x)*(x)*(x)可以时任何数字表达式甚至函数调用来代替参数x。这里再次提醒大家注意括号的使用。宏展开后完全包含在一对括号中,而且参数也包含在括号中,这样

8、就保证了宏和参数的完整性。看一个用法://例4用法intnum=8+2;volume=Cube(num);展开后为(8+2)*(8+2)*(8+2);

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。