- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。
在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:指令用途
#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。
预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如:#defineAAA#includet.c#undefAAA#includet.c为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如:/*my.h*/#ifndefMY_H#defineMY_H……#endif在程序中包含头文件有两种格式:#includemy.h#includemy.h第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中有哪些信誉好的足球投注网站被包含的头文件。第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中有哪些信誉好的足球投注网站被包含的头文件,如果找不到,再有哪些信誉好的足球投注网站编译器自带的头文件。
采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。二、宏宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。
1.#define指令#define预处理指令是用来定义宏的。该指令最简单的格式是:首先神明一个标识符,然后给出这个标识符代表的代码。在后面的源代码中,就用这些代码来替代该标识符。这种宏把程序中要用到的一些全局值提取出来,赋给一些记忆标识符。#defineMAX_NUM10intarray[MAX_NUM];for(i=0;iMAX_NUM;i++)/*……*/在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值。作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序红的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。宏表示的值可以是一个常量表达式,其中允许包括前面已经定义的宏标识符。例如:#defineONE1#defineTWO2#defineTHREE(ONE+TWO)注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考虑,还是应该加上括号的。例如:six=THREE*TWO;预处理过程把上面的一行代码转换成:six=(ONE+TWO)*TWO;如果没有那个括号,就转换成six=ONE+TWO*TWO;了。宏还可以代表一个字符串常量,例如:#defineVERSIONVersion1.0Copyright(c)2003
2.带参数的#define指令带参数的宏和函数调用看起来有些相似。看一个例子
您可能关注的文档
- c语言中常见的7种条件编译语句.doc
- C语言中常见的错误.doc
- C语言中循环移位的操作符.docx
- C语言中整型常量的表示方法.doc
- C语言中的attribute机制.docx
- C语言中的几种常见数据类型.doc
- C语言中的特殊运算符.doc
- c语言中预编译指令的应用.docx
- c语言之printf输出语句.doc
- c语言之whlie循环语句.doc
- 语文-广东省肇庆市2025届高三第二次模拟试卷和答案(肇庆二模).docx
- 中国通信行业运行情况月度报告(2024年1-11月).pdf
- 2024年中国新能源汽车行业全球竞争力分析与各国进口贸易法规影响白皮书-特易资讯.pdf
- 热电“三保”与碳排双控.pdf
- 数据中心行业分析报告 2025.pdf
- 【灼鼎咨询】2024年自动驾驶行业知识报告(智能驾驶、新能源汽车、NOA).pdf
- 政治-江苏省苏州市2024-2025学年2025届高三第一学期学业期末质量阳光指标调研卷试题和答案.docx
- 政治-广东省东莞市、揭阳市、韶关市2025届高三期末教学质量检查试题和答案.docx
- 自适应物理安全与信息安全系统 -智能制造的动态安全方法 2025.pdf
- 【国联证券】通信行业专题研究:Marvell AI day,算力需求推动光互联加速迭代.pdf
文档评论(0)