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

下载本文档

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

文档简介

问:关于 C 语言中的预处理命令? 答: 我们可以在 C 源程序中插入传给 编译程序的各种指令,这些指令被称为预处理器指令(等价于 汇编语言中的伪指令) ,它们扩充了程序设计的环境。 现把常用的预处理命令总结如下: 1. 预处理程序 按照 ANSI 标准的定义,预处理程序应该处理以下 12 条指令: #if、#ifdef 、 #ifndef、#else 、#elif、#endif、#define、#undef、#line 、#error、#prag ma、#include 。 显然,所有的 12 个预处理指令都以符号#开始, ,每条预处理指令必须独占一行。 2. #define #define 指令定义一个标识符和一个串(也就是字符集) ,在源程序中发现该标识符时,都用该 串替换之(原样替换,不要附加任何人为理解上的符号) 。这种标识符称为宏名字,相应的替换称 为宏代换。一般形式如下: #define macro-name char-sequence 这种语句不用分号结尾。宏名字和串之间可以有多个空格符,但串开始后只能以新行终止。 在 C 语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是 C 语句,所以宏定义 的语句结尾不需要加分号。 宏也在 C 里也叫预处理命令,因为宏是在 程序编译前先进行字符替换的,所以叫预处理. 例如:我们使用 LEFT 代表 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 input n” 如果一个串长于一行,可在行尾用反斜线”续行,如下: #define LONG_STRING “This is a very very long string that is used as an example” 3. #error #error 指令强制编译程序停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误 的分支就显示该信息) 。 #error 指令的一般形式是: #error error-message 注意,宏串 error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时还 显示编译程序作者预先定义的其他内容。 4. #include 程序中的#include 指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”) 或一对尖括号(99 printf(“Compiled for array greater than 99.n”); #else printf(“Complied for small array.n”); #endif return 0; 注意,#else 既是标记 #if 块的结束,也标记#else 块的开始。因为每个#if 只能写一个#endif 匹配。 #elif 指令的意思是“否则,如果”,为多重编译选择建立一条 if-else-if(如果-否则-如果链) 。如果#if 表达式为真,该代码块被编译,不测试其他#elif 表达式。否则,序列中的下一块被测试,如果成功 则编译之。一般形式如下: #if expression 1 Statement sequence 1 #elif expression 2 Statement sequence 2 #elif expression 3 Statement sequence 3 #elif expression n Statement sequence n #endif 5.2 #ifdef 和 #ifndef 条件编译的另一个方法是使用编译指令#ifdef 和#ifndef,分别表示“如果已定义”和“如果未 定义” 。#ifdef 的一般形式如下: #ifdef macro-name Statement sequence #endif 如果 macro-name 原先已经被一个#define 语句定义,则编译其中的代码块。 #ifndef 的一般形式是: #ifndef macro-name Statement sequence #endif 如果 macro-name 当前未被#define 语句定义,则编译其中的代码块。 我认为,用这种方法可以很方便的开启/关闭整个程序的某项特定功能。 ? #ifdef 和#ifndef 都可以使用#else 或#el if 语句。 #inlucde #define T 10 Int main(void) #ifdef t Printf(“Hi Tn”); #else Printf(“Hi anyonen”); #endif #ifndef M Printf(“M Not Definedn”); #endif Return 0; 6. #undef #undef 指令删除前面定义的宏名字。也就是说,它的意思是“不要已定义的某个宏” 。一般形 式为: #undef macro-name 7. 使用 defined 除#ifdef 之外,还有另外一种确定是否定义宏名字的方法,即可以将 #if 指令与 defined 编译时 操作符一起使用。defined 操作符的一般形式如下: defined macro-name 如果 macro-name 是当前定义的,则表达式为真,否则为假。 例如,确定宏 MY 是否定义,可以使用下列两种预处理命令之一: #if defined MY 或 #ifdef MY 也可以在 defined 之前加上感叹号”!”来反转相应的条件。例如,只有在 DEBUG 未定义的情况 下才编译。 #if !defined DEBUG Printf(“Final Version!n”); #endif 使用 defined 的一个原因是,它允许由#elif 语句确定的宏名字存在。? 8. #line #line 指令改变_LINE_ 和_FILE_ 的内容。_LINE_ 和 _FILE_都是编译程序中预定义的标 识符(见 11) 。标识符_LINE_的内容是当前被编译代码行的行号, _FILE_的内容是当前被编译 源文件的文件名。#line 的一般形式是: #line number “filename” 其中,number 是正整数并变成_LINE_的新值;可选的 “filename”是合法文件标识符并变成 _FILE_的新值。#line 主要用于调试和特殊应用。 9. #pragma #pragma 是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。例如,一个编 译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma 语句选择该功能。编译程序忽略其 不支持的#pragma 选项。#pragma 提高 C 源程序对编译程序的可移植性。 10. 预处理操作符#和# 有两个预处理操作符:#和#,它们可以在#define 中使用。 操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如: #include #define mkstr(s) #s int main(void) Printf(mkstr(I like C); Return 0; 预处理程序把以下的语句: Printf(mkstr(I like C); 变成 Printf(“I like C”); 操作符#把两个标记拼在一起,形成一个新标记。例如: #include #define concat(a,a) a#b int main(void) Int xy = 10; Printf(“%d”,concat(x,y); Return 0; 预处理程序把以下语句: Printf(“%d”,concat(x,y); 变成 Printf(“%d”,xy); 操作符#和#主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。 11. 预定义宏 C 规范了 5 个固有的预定义宏,它们是: _LINE_:正在编译的程序的行号 _FILE_:正在编译的程序的文件名 _DATE_:代表源文件翻译成目标码的日期,形如 month/day/year(月/ 日/年) _TIME_:代表源代码编译成目标码的时间,形如 hour:minute:second(时:分:秒) _STDC_:如果_STDC_ 的内容是十进制常数 1,则表示编译程序的实现符合标准 C。 问:在程序的一行上可以出现多个有效的预处理命令行。预处理命令可以出现在 函数的内部。给出的两段代码,有一段是错误的,哪段? 答: 第 1 段有问题。 #ifndef WIN32 #endif printf(“OKn“); 在这里,这个 printf 就不会被执行。也就是说, 一行中, 只能有一条预处理指 令,当编译的预处理阶段, 编译器识别了一条完整的预处理指令后,后面的所有东西 他都不要了。 对于第二段,在函数里,我们是可以使用预处理指令的。比如: void fun(void) #ifdef WIN32 . / 对于 windows 系统环境的操作 #else . / 对于 windows 以外的系统环境的操作 #endif /* WIN32 */ . 问:两个 C 语言的小问题(预处理命令) 1#define abc(x,y) (x)(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 语言中,宏定义的问题。 #define NLMSG_ALIGNTO 4 #define NLMSG_ALIGN(len) (len) + NLMSG_ALIGNTO - 1) & (NLMSG_ALIGNTO - 1) 这句编译没错,请问 NLMSG_ALIGNN(len) 的值是多少 答: 1第一句定义了一个符号常量,值为 4。隐含的作用是指定地址对齐方式:按 4 边界对齐。 例如若某个对象的长度为 18,那么在为其分配空间时,通过 NLMSG_ALIGN 宏就可 以计算出最接近其的 4 的倍数为(18+4-1) & (3) = 20,这样便为其申请/分配 20 字节空间。 这是 32 位微控制器/微处理器中,为了防止非对齐操作产生 Exception(异

温馨提示

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

评论

0/150

提交评论