c语言 预处理 命令

上传人:小** 文档编号:89124485 上传时间:2019-05-18 格式:DOC 页数:4 大小:18KB
返回 下载 相关 举报
c语言  预处理 命令_第1页
第1页 / 共4页
c语言  预处理 命令_第2页
第2页 / 共4页
c语言  预处理 命令_第3页
第3页 / 共4页
c语言  预处理 命令_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《c语言 预处理 命令》由会员分享,可在线阅读,更多相关《c语言 预处理 命令(4页珍藏版)》请在金锄头文库上搜索。

1、C语言预处理命令一、概要介绍指令用途#-空指令,无任何效果#include-包含一个源代码文件#define-定义宏#undef-取消已定义的宏#if-如果给定条件为真,则编译下面代码#ifdef-如果宏已经定义,则编译下面代码#ifndef-如果宏没有定义,则编译下面代码#elif-如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif-结束一个#if#else条件编译块#error-停止编译并显示错误信息二、详细分析我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下:1.预处理程序按照ANSI

2、标准的定义,预处理程序应该处理以下指令:#if#ifdef#ifndef#else#elif#endif#define#undef#line#error#pragma#include显然,上述所有的12个预处理指令都以符号#开始,每条预处理指令必须独占一行。2.#define#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:#definemacro-namechar-sequence这种语句不用分号结尾。宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。例如:我们使用LEFT代表

3、1,用RIGHT代表0,我们使用两个#define指令:#defineLEFT1#defineRIGHT0每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。定义一个宏名字之后,可以在其他宏定义中使用,例如:#defineONE1#defineTWOONE+ONE#defineTHREEONE+TWO宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:#defineERROR_MSStandarderroroninputn如果一个串长于一行,可在行尾用反斜线续行,如下:#defineLONG_STRINGThisisaveryverylongStr

4、ingthatisusedasanexample3.#error#error指令强制编译程序停止编译,它主要用于程序调试。#error指令的一般形式是:#errorerror-message注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。4.#include程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号()或一对尖括号()包围,例如:#includestdio.h#includestdio.h都使C编译程序读入并编译头文件以用于I/O系统库函数。包含文件中可以包含其

5、他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双括号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。5.条件编译指令若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。5.1#if、#else、#elif#endif条件编译指令中最常用的或许是#if

6、,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件的包围部分代码。#if的一般形式是:#ifconstant-expressionStatementsequence#endif如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:#includestdio.h#defineMAX100Intmain(void)#ifMAX99printf(Compiledforarraygreaterthan99.n);#els

7、eprintf(Compliedforsmallarray.n);#endifreturn0;注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。#elif指令的意思是否则,如果,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:#ifexpressionStatementsequence#elifexpression1Statementsequence#elifexpression2Stateme

8、ntsequence.#elifexpressionStatementsequence#endif5.2#ifdef和#ifndef条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示如果已定义和如果未定义。#ifdef的一般形式如下:#ifdefmacro-nameStatementsequence#endif如果macro-name原先已经被一个#define语句定义,则编译其中的代码块。#ifndef的一般形式是:#ifndefmacro-nameStatementsequence#endif如果macro-name当前未被#define语句定义,则编译其中的代码块。

9、#ifdef和#ifndef都可以使用#else或#elif语句。#inlucdestdio.h#defineT10Intmain(void)#ifdeftPrintf(HiTn);#elsePrintf(Hianyonen);#endif#ifndefMPrintf(MNotDefinedn);#endifReturn0;6.#undef#undef指令删除前面定义的宏名字。也就是说,它不定义宏。一般形式为:#undefmacro-name7.使用defined除#ifdef之外,还有另外一种确定是否定义宏名字的方法,即可以将#if指令与defined编译时操作符一起使用。defined操作

10、符的一般形式如下:definedmacro-name如果macro-name是当前定义的,则表达式为真,否则为假。例如,确定宏MY是否定义,可以使用下列两种预处理命令之一:#ifdefinedMY或#ifdefMY也可以在defined之前加上感叹号!来反转相应的条件。例如,只有在DEBUG未定义的情况下才编译。#if!definedDEBUGPrintf(FinalVersion!n);#endif使用defined的一个原因是,它允许由#elif语句确定的宏名字存在。8.#line#line指令改变_LINE_和_FILE_的内容。_LINE_和_FILE_都是编译程序中预定义的标识符。标

11、识符_LINE_的内容是当前被编译代码行的行号,_FILE_的内容是当前被编译源文件的文件名。#line的一般形式是:#linenumberfilename其中,number是正整数并变成_LINE_的新值;可选的filename是合法文件标识符并变成_FILE_的新值。#line主要用于调试和特殊应用。9.#pragma#pragma是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。例如,一个编译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma语句选择该功能。编译程序忽略其不支持的#pragma选项。#pragma提高C源程序对编译程序的可移植性。10.预处理操作符#

12、和#有两个预处理操作符:#和#,它们可以在#define中使用。操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如:#includestdio.h#definemkstr(s)#sintmain(void)Printf(mkstr(IlikeC);Return0;预处理程序把以下的语句:Printf(mkstr(IlikeC);变成Printf(IlikeC);操作符#把两个标记拼在一起,形成一个新标记。例如:#includestdio.h#defineconcat(a,a)a#bintmain(void)Intxy=10;Printf(%d,concat(x,y);Re

13、turn0;预处理程序把以下语句:Printf(%d,concat(x,y);变成Printf(%d,xy);操作符#和#主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。11.预定义宏C规范了5个固有的预定义宏,它们是:_LINE_FILE_DATE_TIME_STDC_LINE_和_FILE_包含正在编译的程序的行号和文件名。_DATE_和内容形如month/day/year(月/日/年)的串,代表源文件翻译成目标码的日期。_TIME_中的串代表源代码编译成目标码的时间,形如hour:minute:second(时:分:秒)如果_STDC_的内容是十进制常数1,则表示编译程序的实现符合标准C。七乐无穷,尽在新浪新版博客,快来体验啊请点击进入

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号