C语言中很多的预处理指令include、define等等它们各自的意义分别是什么?
C语言预处理程序的作用是根据源代码中的预处理指令修改你的源代码。预处理指令是一种命令语句(如#define),它指示预处理程序如何修改源代码。在对程序进行通常的编译处理之前,编译程序会自动运行预处理程序,对程序进行编译预处理,这部分工作对程序员来说是不可见的。
预处理程序读入所有包含的文件以及待编译的源代码,然后生成源代码的预处理版本。在预处理版本中,宏和常量标识符已全部被相应的代码和值替换掉了。如果源代码中包含条件预处理指令(如#if),那么预处理程序将先判断条件,再相应地修改源代码。
下面的例子中使用了多种预处理指令:
# include
# define TRUE 1
# define FALSE (!TRUE)
# define GREATER (a, b) ((a) > (b) ? (TRUE) : (FALSE))
# define PIG-LATIN FALSE
void main (void);
void main (void)
{
int x, y;
# if PIG_LATIN
printf("Easeplay enternay ethay aluevay orfay xnay:") ;
scanf("%d", &x) ;
printf("Easeplay enternay ethay aluevay orfay ynay:");
scanf("%d", &y);
#else
printf(" Please enter the value for x: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y);
# endif
if (GREATER(x, y) = = TRUE)
{
# if PIG- LATIN
printf("xnay islay eatergray anthay ynay!
");
#else
printf {" x is greater than y!
" ) ;
# endif
}
else
{
# if PIG_LATIN
printf ("xnay islay otnay eatergray anthay ynay!
");
#else
printf ("x is not greater than y!
");
# endif
}
}
上例通过预处理指令定义了3个标识符常量(即TRUE,FALSE和PIG_LATIN)和一个宏(即GREATER(a,b)),并使用了一组条件编译指令。当预处理程序处理上例中的源代码时,它首先读入stdio.h头文件,并解释其中的预处理指令,然后把所有标识符常量和宏用相应的值和代码替换掉,最后判断PIG_LATIN是否为TRUE,并由此决定是使用拉丁文还是使用英文。
如果PIG_LATIN为FALSE,则上例的预处理版本将如下所示:
/ * Here is where all the include files
would be expanded. * /
void main (void)
{
int x, y;
printf("Please enter the value for X: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y),
if (((x) > (y) ? (1) : (!1)) == 1)
{
printf("x is greater than y!
");
}
else
{
printf{"x is not greater than y!
");
}
}
多数编译程序都提供了一个命令行选项,或者有一个独立的预处理程序,可以让你只启动预处理程序并将源代码的预处理版本保存到一个文件中。你可以用这种方法查看源代码的预处理版本,这对调试与宏或其它预处理指令有关的错误是比较有用的。
中国物联网校企联盟技术部
我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下:
1. 预处理程序
按照ANSI标准的定义,预处理程序应该处理以下指令:
#if #ifdef #ifndef #else #elif
#endif
#define
#undef
#line
#error
#pragma
#include
显然,上述所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。
2. #define
#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:
#define macro-name char-sequence
这种语句不用分号结尾。宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。
例如:我们使用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
”
如果一个串长于一行,可在行尾用反斜线”\”续行,如下:
#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指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号()包围,例如:
#include “stdio.h”
#include
都使C编译程序读入并编译头文件以用于I/O系统库函数。
包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。
文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双括号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。
通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。
5. 条件编译指令
若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。
5.1#if、#else、#elif #endif
条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件的包围部分代码。
#if的一般形式是:
#if constant-expression
Statement sequence
#endif
如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。
#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:
#include
#define MAX 100
Int main(void)
{
#if MAX>99
printf(“Compiled for array greater than 99.
”);
#else
printf(“Complied for small array.
”);
#endif
return 0;
}
注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。
#elif指令的意思是“否则,如果”,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:
#if expression
Statement sequence
#elif expression1
Statement sequence
#elif expression2
Statement sequence
.
.
.
#elif expression
Statement sequence
#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或#elif语句。
#inlucde
#define T 10
Int main(void)
{
#ifdef t
Printf(“Hi T
”);
#else
Printf(“Hi anyone
”);
#endif
#ifndef M
Printf(“M Not Defined
”);
#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!
”);
#endif
使用defined的一个原因是,它允许由#elif语句确定的宏名字存在。
8. #line
#line指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符。标识符__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__
__TIME__
__STDC__
__LINE__和__FILE__包含正在编译的程序的行号和文件名。
__DATE__和内容形如month/day/year(月/日/年)的串,代表源文件翻译成目标码的日期。
__TIME__中的串代表源代码编译成目标码的时间,形如hour:minute:second(时:分:秒)
如果__STDC__的内容是十进制常数1,则表示编译程序的实现符合标准C。
自然语言处理中语料预处理的方法
到目前为止,研究人员已经开发了许多实用的分词工具,使用起来非常简单。如果对分词没有特殊要求,可以直接使用这些分词工具。各种分词工具的列表。词性标注 词性标注是指在切分结果中标注每个词的正确词性,即确定每个词是名词、动词、形容词还是其他词性的过程。词性标注有很多重要的功能。第一,消歧。有些词...
关于C语言预处理命令
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifnde...
常见的预处理命令有哪两种?
i文件中,例如 main.c 的预处理结果在 main.i 中。和.c一样,.i也是文本文件,可以用编辑器打开直接查看内容。C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程 ...
什么是c语言中的预处理器?
预处理过程扫描源代码,对其进行初步的转换。产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。预处理过程还会删除程序中的注释和多余的空白字符。预处理...
C语言的预处理有哪几种?各有什么作用?
文件包含指令(#include)宏定义指令(#define)条件编译指令(#ifdef、#endif、#elif、#if等)宏作用域结束指令(#undef)定义行号指令(#line)产生错误信息指令(#error)向编译器提供额外信息的指令(#pragma)
C语言提供的预处理功能主要有以下三种:
C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等,看你想要进行什么操作了。
C语言 一行只能有一个预处理命令吗?
在源文件的一行上可以有多条预处理指令。预处理指令是以#号开头的代码行,# 号必须是该行除了任何空白字符外的第一个字符。后是指令关键字,在关键字和 # 号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。C语言中#开头的是预...
pre是什么
在C、C++等语言中,预处理的功能尤为重要。比如常用的预处理器指令有#include和#define。#include用于引入外部文件的内容到源代码中,通常用于头文件;而#define用于定义宏常量或宏函数,它们会在编译前替换为相应的值或代码片段。此外,预处理器还处理条件编译指令,如#if、#ifdef等,允许根据不同的条件...
预处理命令文件包含
<文件名>表示标准方式,编译器会从系统预设的头文件目录搜索文件;而 "文件名" 则优先搜索当前目录,如果找不到再转向头文件目录查找。 值得注意的是,头文件中的静态全局变量无需在包含文件中再次声明,因为它们只会在编译时被处理一次。理解并正确使用预处理命令包含是编写高效、可维护代码的关键步骤...
请问C语言中的预处理命令ifdef是什么意思
可以用以下的条件编译: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE float #endif 如果在Windows上编译程序,则可以在程序的开始加上 #define WINDOWS 这样则编译下面的命令行: #define MYTYPE long 如果在这组条件编译命令之前曾出现以下命令行: #define WINDOWS 0 则预编译后程序中...
湛锦环琳: include的作用:#include叫做“文件包含” / include 语句包含并运行指定文件.功能:它的功能是用来指定文件的全部内容替换程序中的命令行,从而使指定的文件与当前源文件连成一个源文件书写格式:#include <文件名> //表示编译系统...
鄂温克族自治旗15923256414: 在C语言中,include,printf是什么意思 - ?
湛锦环琳: include是C语言中的预处理指令,用于包含头文件(.h扩展名).使用方法有两种,#include <xxx.h>#include "xxx.h"使用include包含了一个头文件后,该头文件将在预处理阶段全文被复制到当前程序文件中. 两者区别主要是查找头文件的路径,<>在系统目录中查找,""先在当前目录中查找然后在系统目录中查找.printf为格式化输出函数,将数据输出到屏幕,原型: void printf(const char *format,...);通过format指定格式符,再传入相应的要输出的元素即可.
鄂温克族自治旗15923256414: c语言中的#include是什么意思? - ?
湛锦环琳: include是一个计算机专业术语,它指C/C++中包含头文件命令,用于将指定头文件嵌入源文件中.二指include 指令,在JSP中包含一个静态的文件,同时解析这个文件中的JSP语句.三指PHP语句. 扩展资料: #include <stdio.h> #include<...
鄂温克族自治旗15923256414: 在c语言中,什么是预处理部分,预处理部分是不是也是头文件,即是不是包含文件?预处理部分的作用是什么? - ?
湛锦环琳: 在C语言中预处理的命令是以#开头如常见的#include的作用的就是将其他文件的内容加到该文件中,#ifndef/#define/#end多用于头文件的定义解决重复包含问题,#define常用于定义的宏,还有很多了... 预处理是由预处理器解释和处理的,在C语言源文件被转化成汇编前.要说作用我觉得主要是方便C开发,模块化和源码管理等.
鄂温克族自治旗15923256414: c语言中预处理命令都有哪些 - ?
湛锦环琳: 我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境.现把常用的预处理命令总结如下: 1. 预处理程序 按照ANSI标准的定义,预处理程序应该处理以下指令:#if #ifdef #ifndef #else ...
鄂温克族自治旗15923256414: C语言中的一些预处理语句有什么用? 如:#include - ?
湛锦环琳: 能问这样的问题说明你不是在盲目的学习而是经过了思考,手打原创给你解释下呵呵: 首先你要明白我们编写的程序只是程序的一些关键部分,真正将代码编译为程序是需要很多文件的,打个比方电脑其实并不能直接把printf这个函数直接编译出来,之所以我们能用是因为在其他文件中已经把这个函数写好了,而系统能从你的代码中找到其他文件就是因为预处理语句.通过预处理语句系统可以找到其他文件并把其他文件和你写的代码合并成一个文件然后进行编译,这样才能产生程序,其他的预处理语句比如#if,#ifndef,#ifdef,#endif,#unde其实都是为了防止一个文件被包含多次设置的
鄂温克族自治旗15923256414: C语言中#inculude含义是什么?别说它后面的“stdio.h”什么的,就单#inculude字面意思是什么? - ?
湛锦环琳: #inculude 是预处理命令,就是编译器检测到该命令后就会去搜索相应头文件,把头文件内容导入.
鄂温克族自治旗15923256414: 在C语言中,出现好多include<>....... include“” 是干什么的 什么意思 - ?
湛锦环琳: 头文件包含, 尖括号内为要包含的头文件,一般一个优秀的项目,函数的定义,声明,调用都在不同的文件单元内,一般用到include都是在调用某函数的时候,该函数声明在哪个.h文件,你的尖括号里就写哪个文件,不然程序会找不到该函数的定义,从而报错. 通常所有的头文件包含都是放在翻译单元的最上面.
鄂温克族自治旗15923256414: C语言的预处理有哪几种?各有什么作用? - ?
湛锦环琳: 文件包含指令(#include) 宏定义指令(#define) 条件编译指令(#ifdef、#endif、#elif、#if等) 宏作用域结束指令(#undef) 定义行号指令(#line) 产生错误信息指令(#error) 向编译器提供额外信息的指令(#pragma)
鄂温克族自治旗15923256414: 预处理命令都有哪些? - ?
湛锦环琳: 凡是以"#"开头的均为预处理命令1. 第一种形式: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编...