C语言的预处理命令有哪些?_第1页
C语言的预处理命令有哪些?_第2页
C语言的预处理命令有哪些?_第3页
C语言的预处理命令有哪些?_第4页
C语言的预处理命令有哪些?_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、精选文库问:关于 C 语言中的预处理命令? 答:我们可以在 C 源程序中插入传给 编译程序 的各种指令,这些指令被称为 预处理器指令(等价于 汇编语言中的伪指令 ),它们扩充了程序设计的环境。现把常用的 预处理命令 总结如下:1. 预处理程序按照 ANSI 标准的定义,预处理程序应该处理以下 12 条指令:#if 、#ifdef 、#ifndef、#else、#elif 、#endif、#define、#undef、#line、#error、#pragma、 #include。显然,所有的 12 个预处理指令都以符号 #开始,每条预处理指令 必须独占一行 。2. #define#define

2、指令定义一个 标识符 和一个串(也就是 字符集 ),在源程序 中发现该 标识符时,都用该 串替换之( 原样替换,不要附加任何人为理解上的符号 )。这种 标识符 称为宏名字,相应的替换称为 宏代换。一般形式如下:#define macro-name char-sequence这种语句 不用分号结尾 。宏名字和串之间可以有多个空格符,但 串开始后只能以新行终止 。 在 C 语言里宏定义只用来做的宏名替换, 而不做语法检查的 ,因而它不是 C 语句, 所以宏定义的 语句结尾不需要加分号。宏也在 C里也叫 预处理命令 ,因为宏是在 程序编译 前先进行字符替换的,所以叫预处理 . 例如:我们使用 LEF

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

4、行,如下:#define LONG_STRING “ This is a very very longstring that is used as an example”3. #error#error 指令强制 编译程序 停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误 的分支就显示该信息) 。#error 指令的一般形式是:#error error-message注意,宏串 error-message 不用双引号包围。遇到 #error 指令时,错误信息被显示,可能同时还 显示编译程序作者预先定义的其他内容。4. #include程序中的 #include 指令要求编译程序读入另

5、一个源文件。被读入文件的名字必须用双引号 ( “”或) 一对尖括号 (<>) 包围,例如:#include “ stdio.h ”#include <stdio.h>都使 C编译程序读入并编译 头文件 以用于 I/O系统库函数。包含文件中可以包含其他 #include 指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。 文件名被双括号或尖括号包围决定了对指定文件的搜索方式。 文件名被尖括号包围时,搜索按编译 程序作者的定义进行, 一般用于搜索某些专门放置包含文件的特殊目录。 当文件名被双引号包围时, 搜索按编译程序实时的规定进行,一般搜索当前目录。 如未发现,再按尖括

6、号包围时的办法重新搜 索一次。通常,绝大多数程序员使 用尖括号包围标准的头文件 , 双引号用于包围与当前程序相关的文件 名。5. 条件编译 指令 若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为 条件编译 。5.1 #if 、 #else、 #elif #endif条件编译 指令中最常用的或许是 #if ,#else, #elif 和#endif 。这些指令允许程序员根据常数表达 式的结果有条件地启用(包围)部分代码。#if 的一般形式是:#if constant-expression Statement sequence#endif如 #if 后的常数表达式为真,则 #i

7、f 和 #endif 中间的代码被编译,否则忽略该代码段。 #endif 标记 #if 块的结束。#else 指令的作用与 C 语言的 else 相似, #if 指令失败时它可以作为备选指令。例如:#include <stdio.h>#define MAX 100Int main(void)#if MAX>99printf( “ Compiled for array greater than 9n” );#elseprintf( “ Complied for small arrany”. );#endifreturn 0;3精选文库注意, #else 既是标记 #if 块的结

8、束, 也标记 #else 块的开始。 因为每个 #if 只能写一个 #endif 匹配。 #elif 指令的意思是 “否则,如果 ”,为多重编译选择建立一条if-else-if (如果 -否则-如果链)。如果 #if表达式为真,该代码块被编译,不测试其他 #elif 表达式。否则,序列中的下一块被测试,如果成功 则编译之。一般形式如下:#if expression 1Statement sequence 1#elif expression 2Statement sequence 2#elif expression 3Statement sequence 3#elif expression nS

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

10、 我认为,用这种方法可以很方便的开启/关闭整个程序的某项特定功能。?#ifdef 和#ifndef 都可以使用 #else 或#elif 语句。#inlucde <stdio.h>#define T 10Int main(void)#ifdef tPrintf( “ Hni ”T );#elsePrintf( “ Hi anyonn”e );#endif #ifndef MPrintf( “ M Not Definned” );#endifReturn 0;6. #undef#undef 指令删除前面定义的宏名字。也就是说,它的意思是“不要已定义的某个宏” 。一般形式 为:#und

11、ef macro-name7. 使用 defined除 #ifdef 之外, 还有另外一种确定是否定义宏名字的方法,即可以将 #if 指令与 defined 编译时操作符 一起使用。 defined 操作符的一般形式如下:defined macro-name如果 macro-name 是当前定义的,则表达式为真,否则为假。例如,确定宏 MY 是否定义,可以使用下列两种 预处理命令 之一:#if defined MY或#ifdef MY也可以在 defined 之前加上 感叹号 ”!来”反转相应的条件 。例如, 只有在 DEBUG 未定义的情况下 才编译。#if !defined DEBUGPr

12、intf( “ Final Versionn”! );#endif使用 defined 的一个原因是,它允许由 #elif 语句确定的宏名字存在。?8. #line#line 指令改变 _LINE_ 和_FILE_的内容。 _LINE_ 和_FILE_都是编译程序中预定义的标 识符(见 11)。标识符 _LINE_ 的内容是当前被编译代码行的行号, _FILE_ 的内容是当前被编译 源文件的文件名。 #line 的一般形式是:#line number “ filename ”其中, number 是正整数并变成 _LINE_ 的新值;可选的 “filename 是”合法文件标识符并变成 _FI

13、LE_ 的新值。 #line 主要用于调试和特殊应用。9. #pragma#pragma 是 编译程序实现时定义 的指令,它允许由此向编译程序传入各种指令。例如,一个编 译程序可能具有支持跟踪程序执行的选项,此时可以用 #pragma 语句选择该功能。编译程序忽略其 不支持的 #pragma 选项。 #pragma 提高 C 源程序对编译程序的可移植性。10. 预处理操作符 #和 # 有两个预处理操作符: #和 #,它们可以在 #define 中使用。操作符 #通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如:#include <stdio.h>#define mk

14、str(s) #sint main(void)Printf(mkstr(I like C);Return 0; 预处理程序把以下的语句: Printf(mkstr(I like C); 变成Printf( “I like C ”);操作符 #把两个标记拼在一起,形成一个新标记。例如:#include <stdio.h>#define concat(a,a) a#bint main(void)Int xy = 10;Printf( “ %d” ,concat(x,y);Return 0;预处理程序把以下语句:Printf( “ %d” ,concat(x,y);变成Printf( “

15、 %d” ,xy);操作符 #和 #主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。11. 预定义宏C 规范了 5 个固有的预定义宏,它们是:_LINE_ :正在编译的程序的行号_FILE_ :正在编译的程序的文件名_DATE_ :代表源文件翻译成目标码的日期,形如month/day/year(月 / 日/年 )_TIME_ :代表源代码编译成目标码的时间,形如hour:minute:second( 时:分:秒 )_STDC_ :如果_STDC_的内容是 十进制常数 1,则表示编译程序的实现符合标准C。问:在程序的一行上可以出现多个有效的预处理命令行。预处理命令可以出现在函 数的

16、内部。给出的两段代码,有一段是错误的,哪段?答:第 1 段有问题。#ifndef WIN32#endif printf("OKn");在这里,这个 printf 就不会被执行。也就是说, 一行中, 只能有一条 预处理指 令,当编译的预处理阶段, 编译器识别了一条完整的 预处理指令 后,后面的所有东西 他都不要了。对于第二段,在函数里,我们是可以使用 预处理指令 的。比如:void fun(void)#ifdef WIN32. / 对于 windows 系统环境的操作#else. / 对于 windows 以外的系统环境的操作#endif /* WIN32 */问:两个 C语

17、言的小问题 ( 预处理命令 )1 #define abc(x,y) (x)<(y)?(x):(y)main() int a=10,b=15,c; c=10*abc(a,b); printf("%d",c); 我算出结果是 100,可参考答案是 15,不知是为什么 ? 2 #define A 5.5#define B(x) A*x*xmain() int a=1,b=2; printf("%f",B(a+b); 这个答案是 9.5 ,这又是为何 ?答:1. c = 10*abc(a,b)= 10 * (x)<(y)?(x):(y)= 10 *

18、10 < 15 ? 10 : 15= 100 < 15 ? 10 : 15= 152. B(a+b) = A * a+b * a+b= 5.5 * 1 + 2 * 1 + 2= 5.5 + 2 + 2= 9.5问: C语言预处理命令 #define 选择题:以下程序的运行结果是? #define MAX(A,B) (A)>(B)?(A):(B) #define PRINT(Y) printf(“Y=%dt” ,Y)main()int a=1,b=2,c=3,d=4,t; t=MAX(a+b,c+d);PRINT(t);A )Y=3 B )存在语法错误 C)Y=7 D)Y=0 请给我解释下 PRINT(t); 在宏展开是怎么表示的,答案是 C。答:宏处理的时候,一定要记住:直接代进去,任何多余的动作都不能有(别想当 然地加括号!)。还有记住一点的是在 printf"" 双括号里的是不能替代的话, 所以这里的 Y是输出形 式。而不是字符 常量 Y 的替代。这是一种特殊规定。PRINT(t)=printf("Y=%dt",t); 所以结果必将是 Y=(一个值) 又因为MAX(a+b,c+d)(a+b)>(c+d)?(a+b):(c+d) 的结果是 7,所以,答案是“ C) Y=7”。问:求解:关于 c

温馨提示

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

评论

0/150

提交评论