第9章预处理命令_第1页
第9章预处理命令_第2页
第9章预处理命令_第3页
第9章预处理命令_第4页
第9章预处理命令_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章预处理命令本章将详细介绍ANSIC标准规定的常见预处理命令以及它们的用法。学习目标

了解预处理命令的特点

掌握宏定义的一般方法

掌握文件包含命令的用法

了解条件编译的作用和实现方法

了解其它相关的预处理命令《C语言程序设计》大连理工大学出版社2009年8月出版9.1概述

9.2深入了解宏

9.3条件编译

9.4其它预处理命令

《C语言程序设计》大连理工大学出版社2009年8月出版9.1概述从语法上讲,预处理命令不是C语句,所以每条预处理后面没有“;”号。但是,恰当地使用预处理命令,可以改进程序设计环境,简化程序开发过程,提高程序的可读性和移植性。ANSIC中主要定义了如下三类预处理命令:

1.宏定义

2.文件包含命令

3.条件编译命令[返回]《C语言程序设计》大连理工大学出版社2009年8月出版9.2深入了解宏在第3章,我们介绍了常量宏定义的一般格式;在第6章,我们介绍了带参宏的使用。实际上,宏定义分为两种:常量宏定义和带参宏定义。使用了宏定义的源程序在正式编译之前,要进行宏替换,将源程序中出现的所有宏名都用后面定义的字符串进行替换。《C语言程序设计》大连理工大学出版社2009年8月出版例程9-1常量宏的使用。源代码:#include”stdio.h”#definePI3.14/*定义宏PI*/#defineR3/*定义宏R*/#defineC2*PI*R/*定义宏C*/#defineSPI*R*R/*定义宏S*/intmain(void){printf(“C=%f,S=%f”,C,S);}注意:宏定义可以嵌套。在进行宏替换时,要注意替换的次序,层层替换,从外到里。宏定义后面没有分号,因为宏定义不是C语句。为了和一般变量进行区别,习惯上,宏名用大写字母,宏名所代替的值称为字符串。《C语言程序设计》大连理工大学出版社2009年8月出版例程9-2带参宏定义的使用。源代码:#include”stdio.h”#definePI3.14/*定义宏PI*/#defineC(r)2*PI*r/*定义带参宏C,r是形参*/#defineS(r)PI*r*r/*定义带参宏S,r是形参*/intmain(void){floatr;printf(“请输入圆的半径:\n”);scanf(“%f”,&r);printf(“C=%f,S=%f”,C(r),S(r));/*带参宏C(r)和S(r)的使用,r是实参*/}注意:带参宏定义的替换过程:首先将实参替换形参,然后再替换程序中的宏名。千万要注意的是,实参不需要进行任何计算直接替换,《C语言程序设计》大连理工大学出版社2009年8月出版如果在一个源程序中定义了符号常量,想在使用完后终止该宏定义的使用,可以使用#undef命令。#undef命令格式如下:

#undef符号常量名称(或编译标志)作用:取消最近一次#define符号常量名称(或编译标志)命令,使定义的符号常量或编译标志失去作用。

《C语言程序设计》大连理工大学出版社2009年8月出版

例程9-3#undef的用法。

#include"stdio.h"

intmain(void)

{

#defineS1"123456"/*定义宏S1*/

printf("%s\n",S1);/*使用宏S1*/

#undefS1/*取消宏S1*/

printf("%s\n",S1);/*错误,S1的定义已经取消*/

{

#defineS2"abcdef"/*定义宏S2*/

printf("%s\n",S2);/*使用宏S2*/

}

printf("%s\n",S2);/*使用宏S2*/

return0;

}编译时输出如下编译信息:errorC2065:'S1':undeclaredidentifier[返回]《C语言程序设计》大连理工大学出版社2009年8月出版9.3条件编译

条件编译命令实际上是用来让程序员告诉编译器,程序中哪些程序段该编译,哪些不要编译。条件编译命令的引入,使得不同硬件平台或软件平台的代码可以同时编写在一个程序文件中,从而方便程序的维护和移植。同时,可以针对具体情况,选择代码段被编译。《C语言程序设计》大连理工大学出版社2009年8月出版1.#ifdef宏名程序段1#else程序段2#endif

作用:若宏名已经被#define定义过,则编译程序段1,否则编译程序段2。这条编译命令如同前面学过的if…else….语句,是一种典型的条件编译命令。《C语言程序设计》大连理工大学出版社2009年8月出版2.#ifndef宏名程序段1#else程序段2#endif

作用:若宏名没有被#define定义过,则编译程序段1,否则编译程序段2。与第一种形式完全相反。《C语言程序设计》大连理工大学出版社2009年8月出版3.#if表达式程序段1#else程序段2#endif

作用:若表达式为真,则编译程序段1,否则编译程序段2。此编译命令类似于if…else….语句。《C语言程序设计》大连理工大学出版社2009年8月出版问题:输入一行字符,可以任选两种输出方式:一种将字符变成其前一个字符输出,一种将字符变成其下一个字符输出。用#define命令来控制是否要变化。例如:#defineCHANGE1则变成后一个字符输出。若#defineCHANGE0则变成前一个字符输出。《C语言程序设计》大连理工大学出版社2009年8月出版例程8-4代码:#include”stdio.h”#defineCHANGE1intmain(void){charstr[80],ch;inti=0;;gets(str);while((ch=str[i])!=’\0’){#ifdefCHANGEstr[i]++;if(str[i]>255)str[i]=0;#elsestr[i]--;if(str[i]<0)str[i]=255;#endifi++;}puts(str);}[返回]《C语言程序设计》大连理工大学出版社2009年8月出版9.4其它预处理命令ANSIC中除了规定常用的预编译命令外,还规定了其他一些预编译指令。

1.#error

2.#pragma

3.#line

4.运算符#和##《C语言程序设计》大连理工大学出版社2009年8月出版1.#error

语法格式:

#errormessage作用:编译时输出编译错误信息“message”,从而且方便程序员检查程序中出现的错误。《C语言程序设计》大连理工大学出版社2009年8月出版例程9-5代码:

#include"stdio.h"

intmain(void)

{

#defineS1"123456"

printf("%s\n",S1);

#undefS1

#ifndefS1

#errorNodefinedS1

#endif

{

#defineS2"abcdef"

printf("%s\n",S2);

}

printf("%s\n",S2);

return0;

}编译时输出如下编译信息:fatalerrorC1189:#error:NodefinedS1《C语言程序设计》大连理工大学出版社2009年8月出版2.#pragma

#pragma指令来设定编译器的状态或者是指示编译器触发一些特定的动作。语法格式:

#pragmapara作用是:如果para存在,则触发相应的动作,否则忽略。#pragma提高C源程序对编译程序的可移植性。Para参数有很多,可以是message参数、once、code_seg、hdrstop、resource"*.dfm"、warning(disable:450734;once:4385;error:164)和comment(...),参数不同,作用也不同。《C语言程序设计》大连理工大学出版社2009年8月出版(1)message参数。语法格式:

#pragmamessage(“消息文本”)

作用:表示在编译信息输出窗口中输出相应的“消息文本”信息。(2)code_seg参数。语法格式:

#pragmacode_seg(["section-name"[,"section-class"]])

作用:用来设置程序中函数代码存放的代码段,主要用于开发驱动程序。

《C语言程序设计》大连理工大学出版社2009年8月出版(3)once参数。语法格式:#pragmaonce作用:一般放在在头文件的最开始,用来保证头文件被编译一次。(4)hdrstop参数。语法格式:#pragmahdrstop作用:表示预编译头文件到此为止,后面的头文件不进行预编译。(5)resource"*.dfm"参数。语法格式:#pragmaresource"*.dfm"作用:表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

《C语言程序设计》大连理工大学出版社2009年8月出版(6)warning(disable:369834;once:4385;error:164)参数。语法格式:#pragmawarning(disable:450734;once:4385;error:164)等价于:#pragmawarning(disable:450734)//不显示4507和34号警_告信息#pragmawarning(once:4385)//4385号警_告信息仅报告一次#pragmawarning(error:164)//把164号警_告信息作为一个错误。(7)comment(...)参数。语法格式:#pragmacomment(...)作用:该指令将一个注释记录放入一个对象文件或可执行文件中。《C语言程序设计》大连理工大学出版社2009年8月出版3.#line#line是为了强制编译器按指定的行号,开始对源程序的代码重新编号,在调试的时候,可以按此规定输出错误代码的准确位置。语法格式1:#lineconstant“filename”作用是:使得其后的源代码从指定的行号constant重新开始编号,并将当前文件的名命名为filename。语法格式2:#lineconstant作用:编译时,输出出错代码所在的位置(行号)constant。《C语言程序设计》大连理工大学出版社2009年8月出版4.运算符#和##

操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。操作符##把两个标记拼在一起,形成一个新标记。例程8-6代码:#include<stdio.h>#definesinglej(s)#sintmain(void){printf(singlej(123456));return0;}

注意:“printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论