当前位置: 首页 > 科技观察

C语言预处理命令总结

时间:2023-03-12 22:59:33 科技观察

C程序的源代码中可以包含各种编译指令,这些编译指令称为预处理命令。尽管它们实际上不是C语言的一部分,但它们扩展了C编程环境。本节介绍如何应用预处理器和注释来简化程序开发过程并提高程序的可读性。ANSI标准定义的C语言预处理器包括以下命令:#define、#error、#include、#if、#else、#elif、#endif、#ifdef、#ifndef、#undef、#line、#pragma、etc.很明显,所有的预处理命令都是以符号#开头的,下面会单独介绍。#define命令#define定义一个标识符和一个字符串。每次在源程序中遇到标识符时,它都会被定义的字符串替换。ANSI标准将标识符定义为宏名称,并将替换过程称为宏替换。该命令的一般形式为:#defineidentifierstring注:1该语句中没有分号。标识符和字符串之间可以有任意数量的空格,字符串一旦开始,仅以换行符结束。2宏名定义后,可以成为其他宏名定义的一部分。3宏替换只是将宏标识符替换为文本字符串,前提是宏标识符必须是独立标识的,否则不进行替换。例如:#defineXYZ这是一个使用宏printf("XYZ")的测试;//本节不打印“thisisatest”而是打印“XYZ”。因为预编译器识别“XYZ”4如果字符串超过一行,可以在行尾使用反斜杠'\'来续行。#defineLONG_STRING"thisisaverylong\stringthatisusedasexample"5C语言程序一般使用大写字母来定义标识符。6使用宏替换而不是实际函数的一大好处是宏替换提高了代码的速度,因为没有函数调用开销。但提高速度是有代价的:由于重复编码而增加了程序长度。二#error命令#error强制编译器停止编译,主要用于程序调试。#error指令使预处理器发出包含指令文本的错误消息。该指令的目的是在程序崩溃之前给出某些信息。三#include命令#include使编译器将另一个源文件嵌入到带#include的源文件中,要读取的源文件必须用双引号或尖括号括起来。例如:#include"stdio.h"or#include这两行代码使用C编译器读取和编译处理磁盘文件库的子程序。可以在#include命令中将文件嵌入到文件中。这种方式称为嵌套嵌入文件,嵌套层次取决于具体实现。如果显式路径名是文件标识符的一部分,则仅在那些子目录中搜索嵌入文件。否则,如果文件名用双引号引起来,则首先检索当前工作目录。如果找不到该文件,将搜索命令行中指定的所有目录。如果仍未找到该文件,则搜索在实现时定义的标准目录。如果没有明确的路径名并且文件名包含在尖括号中,则首先在编译命令行的目录中搜索。如果找不到文件,则搜索标准目录,而不是当前工作目录。四个条件编译命令有几个命令可以有选择地编译程序源代码的各个部分。这个过程称为条件编译。商业软件公司广泛使用条件编译来提供和维护程序的多个客户版本。#if、#else、#elif和#endif#if的一般含义是,如果#if后面的常量表达式为真,则编译它和#endif之间的代码,否则跳过这些代码。命令#endif标记#if块的结束。#ifconstant-expressionstatementssequence#endifEg:#defineMAX91#includeusingnamespacestd;intmain(){#ifMAX>99cout<<"MAXisbiggerthan99"<#elifMAX>90cout<<"MAXisbiggerthan90"<#elsecout<<"MAXissmallerthan90"<#endifreturn0;}后跟#if后面的表达式是在编译时求值的,所以它只能包含常量和定义的标识符,不能使用变量。表达式不允许包含运算符sizeof(sizeof也在编译时求值)。#else命令的作用有点像C语言中的else;#else建立另一个选择(在#if失败的情况下)。请注意#else属于#if块。#elif命令的含义与ELSEIF的含义相同。它形成一个ifelse-ifladder语句,可以执行多个编译选项。#elif后跟常量表达式。如果表达式为真,则编译以下代码块而不测试其他#elif表达式。否则,将依次测试下一个块。#ifexpressionstatementssequence#elifexpression1statementssequence#endif#endif、#else或#elif匹配嵌套条件编译中最近的#if或#elif。#ifdef和#ifndef条件编译的另一种方法是使用#ifdef和#ifndef命令,它们分别代表“ifdefined”和“ifnotdefined”。#ifdef的一般形式是:#ifdefmacronamestatementssequence#endif#ifdef和#ifndef可以用在#if、#else、#elif语句中,但必须与#endif结合使用。#defineMAX91#includeusingnamespacestd;intmain(){#ifdefMAXcout<<"hello,MAX!"<#elsecout<<"whereisMAX?"<#endif#ifndefLEOcout<<"LEOisnotdefined"<#endifreturn0;}命令#undef取消一个after宏名定义之前已经定义过了。一般形式为:#undefmacroname命令#line改变__LINE__和__FILE__的内容,它们是编译器中预定义的标识符。命令的基本形式如下:#linenumber["filename"]其中数字是任何正整数,可选的文件名是任何有效的文件标识符。行号是源程序中的当前行号,文件名是源文件的名称。命令#line主要用于调试和其他特殊应用。注意:#line之后的数字标识下一行开始的数字。#line100"jia"cout<<"#linechangelineandfilename!"