导航:首页 > 程序命令 > c中预处理命令教学

c中预处理命令教学

发布时间:2024-05-03 07:18:22

❶ C语言中很多的预处理指令include、define等等它们各自的意义分别是什么

include的作用: #include叫做“文件包含” / include 语句包含并运行指定文件。 功能:它的功能是用来指定文件的全部内容替换程序中的命令行,从而使指定的文件与当前源文件连成一个源文件 书写格式: #include <文件名> //表示编译系统根据系统头文件存放的目录路径去搜索系统头文件,而不是在源文件目录去查找 #include "文件名" //表示编译系统首先在当前的源文件目录中查找,若未找到才根据系统的头文件存放的目录路径去搜索系统头文件 //系统定义的头文件通常使用尖括号;用户自定义的头文件通常使用双引号。 //一般来说,如果为调用库函数而用#include命令来包含相关的头文件,则用尖括号,以节约查找时间。 //如果要包含的是用户自己编写的文件(这种文件一般都在用户当前的目录中),一般用双撇号。 //若文件不在当前目录中,在双撇号内应该给出文件路径(如#include"C:\wang\file2.h") ----------------- 1.#define 的作用 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。 在C或C++语言中,“宏”分为有参数和无参数两种。 2. 无参宏定义 无参宏的宏名后不带参数。 其定义的一般形式为: #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如: #define M (a+b) 它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。 程序1: #define M (a+b) main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=M*M; printf("s=%d\n",s); } 上例程序中首先进行宏定义,定义M来替代表达式(a+b),在 s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)*(a+b) 但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。 如当作以下定义后:#difine M (a)+(b) 在宏展开时将得到下述语句:S= (a)+(b)*(a)+(b) 对于宏定义还要说明以下几点: 1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。 3. 带参宏定义 c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(形参表) 例如: #define M(y) ((y)*(y)+3*(y)) /*宏定义*/ .... k=M(5); /*宏调用*/ .... 在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为: k=5*5+3*5 程序2: #define MAX(a,b) (a>b)?a:b main(){ int x,y,max; printf("input two numbers: "); scanf("%d%d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); } 上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a>b)?a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y; 用于计算x,y中的大数。

❷ 关于C语言预处理命令

第一句有问题。
比如
#ifndef WIN32
#endif printf("OK\n");
在这里,这个printf就不会被执行。也就是说, 一行中, 只能有一条预处理指令,
当编译的预处理阶段, 编译器识别了一条完整的预处理指令后,后面的所有东西他都不要了。
对于第二句,在函数里,我们是可以使用预处理指令的。
比如
void fun(void)
{
#ifdef WIN32
... // 对于windows系统环境的操作
#else
... // 对于windows以外的系统环境的操作
#endif /* WIN32 */
...
}

楼上的同学, 你是在哪儿本书上看的? 介绍一下呗

❸ c语言中预处理命令都有哪些

我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下: x0dx0a1. 预处理程序x0dx0a按照ANSI标准的定义,预处理程序应该处理以下指令:x0dx0a#if #ifdef #ifndef #else #elifx0dx0a#endifx0dx0a#definex0dx0a#undefx0dx0a#linex0dx0a#errorx0dx0a#pragmax0dx0a#includex0dx0a显然,上态李族述所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。x0dx0a2. #definex0dx0a#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:x0dx0a#define macro-name char-sequencex0dx0a这种语句不用分号结尾。宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。x0dx0a例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:x0dx0a#define LEFT 1x0dx0a#define RIGHT 0x0dx0a每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。x0dx0a定义一个宏名字之后,可以在其他宏定义中使用,例如:x0dx0a#define ONE 1x0dx0a#define TWO ONE+ONEx0dx0a#define THREE ONE+TWOx0dx0a宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:x0dx0a#define ERROR_MS “Standard error on input \n”x0dx0a如果一个串长于一行,可在行尾用反斜线”\”续行,如下:x0dx0a#define LONG_STRING “This is a very very long \x0dx0aString that is used as an example”x0dx0a3. #errorx0dx0a#error指令强制编译程序停止编译,它主要用于程序调试。#error指令的一般形式是:x0dx0a#error error-messagex0dx0a注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。x0dx0a4. #includex0dx0a程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号(<>)包围,例如:x0dx0a#include “stdio.h”x0dx0a#include x0dx0a都使C编译程序读入并编译头文件帆弊以用于I/O系统库函数。x0dx0a包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。x0dx0a文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双括号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。x0dx0a通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。x0dx0ax0dx0a5. 条件编译指令x0dx0a若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。x0dx0a5.1#if、#else、#elif #endifx0dx0a条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允扰档许程序员根据常数表达式的结果有条件的包围部分代码。x0dx0a#if的一般形式是:x0dx0a#if constant-expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。x0dx0a#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:x0dx0a#include x0dx0a#define MAX 100x0dx0aInt main(void)x0dx0a{x0dx0a#if MAX>99x0dx0aprintf(“Compiled for array greater than 99.\n”);x0dx0a#elsex0dx0aprintf(“Complied for small array.\n”);x0dx0a#endifx0dx0areturn 0;x0dx0a}x0dx0a注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。x0dx0a#elif指令的意思是“否则,如果”,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:x0dx0a#if expressionx0dx0aStatement sequencex0dx0a#elif expression1x0dx0aStatement sequencex0dx0a#elif expression2x0dx0aStatement sequencex0dx0a.x0dx0a.x0dx0a.x0dx0a#elif expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a5.2#ifdef和#ifndefx0dx0a条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。#ifdef的一般形式如下:x0dx0a#ifdef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name原先已经被一个#define语句定义,则编译其中的代码块。x0dx0a#ifndef的一般形式是:x0dx0a#ifndef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name当前未被#define语句定义,则编译其中的代码块。x0dx0ax0dx0a我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。x0dx0a#ifdef和#ifndef都可以使用#else或#elif语句。x0dx0a#inlucde x0dx0a#define T 10x0dx0aInt main(void)x0dx0a{x0dx0a#ifdef tx0dx0aPrintf(“Hi T\n”);x0dx0a#elsex0dx0aPrintf(“Hi anyone\n”);x0dx0a#endifx0dx0a#ifndef Mx0dx0aPrintf(“M Not Defined\n”);x0dx0a#endifx0dx0aReturn 0;x0dx0a}x0dx0a6. #undefx0dx0a#undef指令删除前面定义的宏名字。也就是说,它“不定义”宏。一般形式为:x0dx0a#undef macro-namex0dx0a7. 使用definedx0dx0a除#ifdef之外,还有另外一种确定是否定义宏名字的方法,即可以将#if指令与defined编译时操作符一起使用。defined操作符的一般形式如下:x0dx0adefined macro-namex0dx0a如果macro-name是当前定义的,则表达式为真,否则为假。x0dx0a例如,确定宏MY是否定义,可以使用下列两种预处理命令之一:x0dx0a#if defined MYx0dx0a或x0dx0a#ifdef MYx0dx0a也可以在defined之前加上感叹号”!”来反转相应的条件。例如,只有在DEBUG未定义的情况下才编译。x0dx0a#if !defined DEBUGx0dx0aPrintf(“Final Version!\n”);x0dx0a#endifx0dx0a使用defined的一个原因是,它允许由#elif语句确定的宏名字存在。x0dx0a8. #linex0dx0a#line指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符。标识符__LINE__的内容是当前被编译代码行的行号,__FILE__的内容是当前被编译源文件的文件名。#line的一般形式是:x0dx0a#line number “filename”x0dx0a其中,number是正整数并变成__LINE__的新值;可选的“filename”是合法文件标识符并变成__FILE__的新值。#line主要用于调试和特殊应用。x0dx0ax0dx0a9. #pragmax0dx0a#pragma是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。例如,一个编译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma语句选择该功能。编译程序忽略其不支持的#pragma选项。#pragma提高C源程序对编译程序的可移植性。x0dx0a10. 预处理操作符#和##x0dx0a有两个预处理操作符:#和##,它们可以在#define中使用。x0dx0a操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如:x0dx0a#include x0dx0a#define mkstr(s) #sx0dx0aint main(void)x0dx0a{x0dx0aPrintf(mkstr(I like C));x0dx0aReturn 0;x0dx0a}x0dx0a预处理程序把以下的语句:x0dx0aPrintf(mkstr(I like C));x0dx0a变成x0dx0aPrintf(“I like C”);x0dx0a操作符##把两个标记拼在一起,形成一个新标记。例如:x0dx0a#include x0dx0a#define concat(a,a) a##bx0dx0aint main(void)x0dx0a{x0dx0aInt xy = 10;x0dx0aPrintf(“%d”,concat(x,y));x0dx0aReturn 0;x0dx0a}x0dx0a预处理程序把以下语句:x0dx0aPrintf(“%d”,concat(x,y));x0dx0a变成x0dx0aPrintf(“%d”,xy);x0dx0a操作符#和##主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。x0dx0a11. 预定义宏x0dx0aC规范了5个固有的预定义宏,它们是:x0dx0a__LINE__x0dx0a__FILE__x0dx0a__DATE__x0dx0a__TIME__x0dx0a__STDC__x0dx0a__LINE__和__FILE__包含正在编译的程序的行号和文件名。x0dx0a__DATE__和内容形如month/day/year(月/日/年)的串,代表源文件翻译成目标码的日期。x0dx0a__TIME__中的串代表源代码编译成目标码的时间,形如hour:minute:second(时:分:秒)x0dx0a如果__STDC__的内容是十进制常数1,则表示编译程序的实现符合标准C。

❹ c语言中预处理命令都有哪些

C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。x0dx0a 预处理命令以符号“#”开头。x0dx0ax0dx0a宏定义命令:#define、#undef,用来定义和解除宏。(值得注意的是还可以定义带参数的宏)x0dx0ax0dx0a文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者时会优先从当前目录查找头文件,使用后者时优先从默认的系统目录查找。x0dx0ax0dx0a条件编译:#ifdef、#else、#endif、#elif 等。出于程序兼容性的考虑,有些语句希望在条件满足时才编译。这时候会用到条件编译的命令。

阅读全文

与c中预处理命令教学相关的资料

热点内容
大爷程序员 浏览:197
自私的基因pdf 浏览:470
程序员是怎么做优化设置 浏览:250
命令与征服现代冲突视频 浏览:677
基于单片机的文献综述 浏览:998
dnf扫货脚本源码 浏览:728
用于编译器中缓解控制冲突的方法 浏览:193
rt3070aplinux 浏览:650
变频空调压缩机用电容可以启动吗 浏览:319
爱迪尔门锁怎么看服务器地址 浏览:818
江淮车智联服务器内容错误什么 浏览:133
zip解压软件叫什么 浏览:893
java域名绑定 浏览:902
dns服务器很差什么意思 浏览:123
西门子数控机床编程与操作 浏览:993
工频压缩机专修 浏览:383
什么app可以连接电视 浏览:173
神舟电脑无法复制文件夹 浏览:57
s7相片怎么加密 浏览:530
单片机串接cd4094 浏览:820