第9章 预处理命令

合集下载

第九章预处理命令(5503)

第九章预处理命令(5503)

1.下面叙述中正确的是(A )。

A.带参数的宏定义中参数是没有类型的B.宏展开将占用程序的运行时间C.宏定义命令是C语言中的一种特殊语句D.使用#include命令包含的头文件必须以“.h”为后缀2.在宏定义#define PI3.14159中,用宏名代替一个( D )A.常量B.单精度数C.双精度数D.字符串3.下面有关宏替换的叙述不正确的是( D )A.宏替换不占用运行时间B.宏名无类型C.宏替换只是字符替换D.宏名必须用大写字母表示4.C语言的编译系统对宏命令的处理是( D )A.在程序运行时进行的B.和C程序中的其他语句同时进行编译的C.在程序连接时进行的D.在对源程序中其它成分正式编译之前进行的5.下列定义不正确的是(C )。

A.#define PI 3.141592B.#define S345C.int max(x,y); int x,y; { }D.static char c6.有如下宏定义 #define s(a) a*3 ,则执行表达式x=s(1+2)后,变量x的值为( D)。

A.10B.9C.8D.77.以下说法中正确的是( D)。

A.#define是C语句B.#define是库函数C.#define是自定义函数D.#define是预处理命令8.在“文件包含”预处理语句的使用形式中,当#include后面的文件用了“”(双引号)时,寻找被包含文件的方式是(B)。

A.直接按系统设定的标准方式搜索目录B.先在源程序所在目录搜索,再按系统设定的标准方式搜索C.仅仅搜索源程序所在目录D.仅仅搜索当前目录9.以下叙述正确的是( B )。

A.可以把define和if定义为用户标识符B.可以把define定义为用户标识符,但不能把if定义为用户标识符C.可以把if定义为用户标识符,但不能把define定义为用户标识符D.define和if都不能定义为用户标识符10.以下叙述中正确的是( B )。

预处理指令详解

预处理指令详解

#pragma#pragma 预处理指令详解在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。

依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数。

(1)message 参数。

Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。

其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。

假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。

我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg。

格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

预处理命令

预处理命令

二、表演区 (一)什么是表演区 表演区以幼儿表演游戏为设计核心,通过道具吸引幼儿积极参加故事表 演、游戏等活动。 (二)表演区的环境布置与材料投放 表演区可以分为固定式和活动式表演区角两类。 固定式的表演区角是指在活动室内辟出一定区域,存放表演所需要的用 具。 活动式的表演区角则是根据表演需要,临时在走廊、门厅、过道或室外 等地方设置表演场所,便于及时放置和收拢。
第9章 预处理命令
• 9. 1 概述 • 9. 2 宏定义 • 9. 3 文件包含 • 9. 4 条件编译
9. 2 宏定义
• 9. 2. 1 无参宏定义
• 无参宏的宏名后不带参数。 • 其定义的一般形式为 • #define 标识符字符串 • 其中, #表示这是一条预处理命令; 凡是以#开头的指令均为预处理命
果果:“老师,一分钟是多久呢?” 教师:“就是一会儿,我一转身。” 贝贝:“我知道,最细的秒针走一圈,挺长的。” 佳佳:“一分钟就是我们从门口走到后面的窗子那里。” 教师:“一分钟能做什么?” 佳佳:“给花浇水。” 果果:“唱完一首歌。” 贝贝:“搬来一把椅子。”……
学习目标
1. 了解幼儿日常交谈的主要特点及指导要求。 2. 掌握语言区角的环境布置与材料投放要求,能科学地开展语言区角活 动的指导。 3. 学会设计听说游戏的玩法,并能评析幼儿园听说游戏。
上一页 下一页 返回
9. 2 宏定义
• 【例9 - 2】不作宏代换程序举例。
上一页 下一页 说明: • 虽然已定义宏名OK 表示100, 但在printf 语句中OK 被引号括起来, 因
此不作宏代换。 • 程序的运行结果为“OK”, 这表示把“OK” 当字符串处理。
上一页 下一页 返回
义时, 必须十分注意, 应保证在宏代换之后不发生错误。

.net 预处理详解

.net 预处理详解

.net 预处理详解在使用.net框架进行软件开发时,我们经常会遇到需要在编译阶段对代码进行预处理的情况。

预处理是指在编译代码之前,通过指定一些预处理指令来控制代码的编译过程。

预处理指令在代码中以`#`符号开头,告诉编译器应该如何处理代码。

在本文中,我们将详细介绍.net 框架中常用的预处理指令及其用法。

1. 条件编译条件编译是预处理中最常用的功能之一,它可以根据一些条件来决定是否编译一段特定的代码。

通过使用`#if`和`#endif`指令,我们可以在代码中嵌入任意条件来控制编译过程。

例如,我们可以使用条件编译来根据不同的操作系统平台编译不同的代码片段:```csharp#if WINDOWSConsole.WriteLine("This is a Windows platform.");#elif LINUXConsole.WriteLine("This is a Linux platform.");#endif```上述代码中,`#if`指令用于判断是否为Windows平台,如果是则输出相应的信息;`#elif`指令用于判断是否为Linux平台,如果是则输出相应的信息。

通过条件编译,我们可以根据具体情况选择性地编译代码,以实现更好的跨平台兼容性。

2. 定义常量预处理指令还可以用于定义常量,在编译过程中将其替换为指定的值。

通过`#define`指令可以定义一个常量,并在代码中使用该常量。

例如:```csharp#define MAX_VALUE 100int value = MAX_VALUE;```上述代码中,我们使用`#define`指令定义了一个名为`MAX_VALUE`的常量,并将其设置为100。

之后,在代码中使用该常量时,编译器会将其替换为实际的值。

这样可以提高代码的可读性和维护性。

3. 跳过代码有时候,在调试或者测试代码时,我们需要暂时跳过一些代码片段而不编译它们。

预处理命令

预处理命令

3
math.h——文件包含数学程序。 reg51.h——文件中包含51单片机的特殊寄存器定义。 reg52.h——文件中包含52单片机的特殊寄存器定义。 setjmp.h——文件包含定义jmp_buf类型和setjmp和longjmp程序原型。 stdarg.h——文件包含可变长度参数列表程序。 stdlib.h——文件包含存储区分配程序。 stdio.h——文件包含标准输入和输出程序。 string.h——文件包含字符串操作程序、缓冲区操作程序。 对于51单片机而言,源程序开头必须要包含reg51.h头文件,因为该文件对51单片 机的相关位及寄存器进行了定义,这样在程序中才可以正常使用寄存器等资源。
#else 程序段2
#endif 若常量表达式成立,则编译程序1,否则编译程序2。
5
单片机原理及应用
单片机原理及应用
C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。在编译环 境对源程序进行编译前,需要先对程序中的预处理命令进行处理,然后将处理结果和源 程序一起编译。C51语言中的预处理命令包括宏定义命令、文件包含命令和条件编译命 令等。通常,除条件编译命令外,预处理命令一般放在函数体之外,并且通常都放置在 源文件的开头。
句如下:
outputs=0xff;
/*输出 1111 1111 */
进行编译时,预处理器会将整个程序中的所有outputs替换为P2。
2.文件包含命令
#include命令的功能是将指定的定义或声明文件放入程序之中,该命令常用于引入 标准库函数文件。下面是一些常用的C51头文件:
absacc.h——包含允许直接访问8051不同存储区的宏定义。 assert.h——文件定义宏,用来建立程序的测试条件。 ctype.h——包含字符转换和分类程序。 intrins.h——文件包含指示编译器产生嵌入式固有代码的程序原型。

C语言程序设计教案 第九章 编译预处理

C语言程序设计教案  第九章 编译预处理

第九章编译预处理课题:第九章编译预处理教学目的:1、了解预处理的概念及特点2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用步骤一复习引导ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。

这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。

必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。

经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。

步骤二讲授新课C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。

C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。

分别用宏定义命令、文件包含命令、条件编译命令来实现。

为了与一般C语句相区别,这些命令以符号“ #” 开头。

§9.1宏定义宏:代表一个字符串的标识符。

宏名:被定义为“宏”的标识符。

宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。

一、不带参数的宏定义一般形式:#define 标识符字符串#define PI 3.1415926main(){ float l, s, r, v;printf( “input radius:” );scanf( “%f”, &r );l = 2.0*PI*r;s = PI*r*r;v = 3.0/4*PI*r*r*r;printf(“%10.4f,%10.4f,%10.4\n”, l, s, v);}例如:由键盘输入y值,求表达式:3(y2+3y)+ 4(y2+3y)+ y(y2+3y)#define M (y*y+3*y)main(){ int s, y;printf( “Input a number :”); scanf (“%d”,&y);s=3*M+4*M+y*M; p rintf(“s=%d\n”,s);}先宏展开:s=3*(y*y+3*y) +4*( y*y+3*y) + y*(y*y+3*y)再与源程序合并说明:⑴宏名一般用大写表示,以便与变量名区分。

C程序设计第三版谭浩强习题答案全下

C程序设计第三版谭浩强习题答案全下

s ,另一个用来 第 9 章 预处理命令9.1 定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的 实参。

输出已交换后的两个值。

解:# define SWAP(a,b) t=b;b=a;a=tmain ( ){int a,b,t;printf( “ Input two integers a,b: ” );scanf( “ %d,%d, ” *a,*b);SWAP(a,b);printf(“ Now,a=%d,b=%n ”d ,a,b);} 运行结果如下:In put two in tegers a,b : 3,4/Now,a=4,b=39.2 输入两个整数,求它们相除的余数。

用带参的宏来实现,编程序。

解:# define SURPLUS(a,b) a%bmain ( ){int a,b;printf( “Input two integers a,b:”); scanf( “ %d,%d ” ,&a,&b);printf(“Remember i s n%”d , SURPLUS(a , b));} 运行结果如下:Input two integers a,b : 60,13/Remember is 89.3 三角形的面积为: area=其中 s= (a+b+c),a,b,c 为三角形的三边。

定义两个带参的宏,一个用来求 求area 。

写程序,在程序中用带实参的宏名来求面积area 。

解:# include <math.h># define S(a,b,c)(a+b+c)/2# define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)) main ( ) {float a,b,c; printf(“Input a,b,c: ”);scanf( “ %f,%f,%f ” ,&a,&b,&c);if (a+b>c && a+c>b && b+c>a)printf(“ area:%8n.2”f. ,AREA(a,b,c));elseprintf( “ It is not a triangle! ” );}运行结果:①In put a,b,c: 3,4,5/area:6.00②In put a,b,c: 12,3,5/It is not a triangle!9.4给年份year 定义一个宏,以判断该年份是否为闰年。

C语言程序设计 第3版 第9章 编译预处理

C语言程序设计 第3版 第9章 编译预处理
int s; s=sum(5); printf("s%d\n",s); }
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.宏定义也可用来定义多个语句,在宏调用时,把这些语句 又代换到源程序内。 【例9.11】 #define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h; main() { int l=3,w=4,h=5,sa,sb,sc,vv; SSSV(sa,sb,sc,vv); printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv); }
不是a+1的平方 运行情况: input a number:3↙ sq=7 错在哪里?如何修改?
【例9.7】 #define SQ(y) (y)*(y) void main() /*以宏的方式求某数的平方除160的结果*/ { int a,sq; printf("input a number: "); scanf("%d",&a); sq=160/SQ(a+1); 原因在于,宏代换后变为: sq=160/(a+1)*(a+1); printf("sq=%d\n",sq); }
9.2.2
带参宏定义
带参宏中的两种参数: 在宏定义中的参数称为形式参数 在宏调用中的参数称为实际参数 带参宏定义的一般形式为: 宏名(形参表) #define 宏名(形参表) 字符串 带参宏调用的一般形式为: 宏名(实参表) 宏名(实参表)
在字符串中含有 各个形参
对带参数的宏,在调用中不仅要宏展开,而且要用实参 去代换形参。 例如: #define M(y) y*y+3*y …… k=M(5); ……
9.4
条件编译
条件编译:按不同的条件去编译不同的程序部分 条件不同,则条件编译产生目标代码文件不同,这对于程序 的移植和调试是很有用的 条件编译有三种形式,下面分别介绍:
1. 第一种形式: #ifdef 标识符 程序段1 程序段1 #else 程序段2 程序段2 #endif 功能:如果标识符已被#define命令定义过,则对程序段1 进行编译;否则对程序段2进行编译。 如果没有程序段2,则#else可以没有,即可以写为: #ifdef 标识符 程序段 #endif
7) 对“输出格式”作宏定义,可以减少书写麻烦。 【例9.3】中就采用了这种方法。 #define P printf #define D "%d\n #define F %f\n" void main() { int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); }
运行情况: input a number:3 ↙ sq=160 错在哪里?如何修改?
【例9.8】 #define SQ(y) ((y)*(y)) main(){ int a,sq; printf("input a number: "); scanf("%d",&a); sq=160/SQ(a+1); printf("sq=%d\n",sq); }
【例9.1】 #define M (y*y+3*y) /*宏定义*/ void main() { int s,y; printf("input a number: "); scanf("%d",&y); s=3*M+4*M+5*M; printf("s=%d\n",s); } 宏展开后该语句变为:
2. 第二种形式: #ifndef 标识符 程序段1 程序段1 #else 程序段2 程序段2 #endif 功能:如果标识符未被#define命令定义过,则对程序段1 进行编译,否则对程序段2进行编译。
3. 第三种形式: #if 常量表达式 程序段1 程序段1 #else 程序段2 程序段2 #endif 功能:如果常量表达式的值为真(非0),则对程序段1 进 行编译,否则对程序段2进行编译。
第九章
预处理命令
9.1 概述
以“#”号开头的命令即预处理命令 预处理命令放在函数之外,而且一般都放在源文件的 最前面 预处理命令的末尾无分号 预处理是指在进行编译的第一遍扫描(词法扫描和语法 分析)之前所作的工作。 预处理由预处理程序负责完成 预处理完毕自动进入对源程序的编译
9.2
宏定义
用一个标识符来表示一个字符串,称为“宏”。 被定义为“宏”的标识符称为“宏名”。 在编译预处理时,对程序中所有出现的“宏名”,都用 宏定义中的字符串去代换,这称为“宏代换”或“宏展 开”。 宏定义是由源程序中的宏定义命令完成的。宏代换是由 预处理程序自动完成的。 “宏”分为有参数和无参数两种。
9.3
文件包含
文件包含命令行的一般形式为: 文件名" #include "文件名" 或 文件名> #include <文件名> 文件包含命令的功能:把指定的文件插入该命令行位置取 代该命令行,从而把指定的文件和当前的源程序文件连 成一个源文件。
对文件包含命令还要说明以下几点:
1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括 起来,但是这两种形式是有区别的: 使用尖括号表示在包含文件目录中去查找,而不在源文件目录查找 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到 包含目录中去查找 2. 一个include命令只能指定一个被包含文件,若有多个文件要包 含,则需用多个include命令。 3. 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一 个文件。
/*宏定义*/ /*宏调用*/
预处理后变为: k=5*5+3*5
对于带参的宏定义有以下问题需要说明:
1. 带参宏定义中,宏名和形参表之间不能有空格出现。 例如把: #define MAX(a,b) (a>b)?a:b 写为: #define MAX (a,b) (a>b)?a:b 若有以下宏调用语句: 无参宏 max=MAX(x,y); 定义 宏展开后将变为: max=(a,b)(a>b)?a:b(x,y); 错误
二者大不相 同,结果会 发生差异
s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);
在宏定义中表达式(y*y+3*y)两边的括号如果省略, 会产生另外一个结果。即宏定义改变如下: #difine M y*y+3*y 在宏展开时将得到下述语句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;
9.2.1 无参宏定义
无参宏的宏名后不带参数。 其定义的一般形式为: #define 标识符 字符串 说明: • “#”表示这是一条预处理命令。 • “define”为宏定义命令。 • “标识符”为所定义的宏名。 • “字符串”可以是常数、表达式、格式串等。 例如: #define M (y*y+3*y)
对于宏定义还要说明以下几点:
1) 宏展开只是一种简单的代换,预处理程序对宏代表的字符 串不作任何检查。如有错误,只能在编译源程序时发现。 2) 宏定义不是说明或语句,在行末不必加分号,如加上分号 则连分号也一起置换。 3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源 程序结束。如要终止其作用域可使用# undef命令。 例如: #define PI 3.14159 void main() { …… } #undef PI void f1() { …… }
4)宏名若用引号括起来,则预处理程序不对其作宏代换。 【例9.2】 #define பைடு நூலகம்K 100 void main() { printf("OK"); printf("\n"); }
运行结果: OK
5) 宏定义允许嵌套,在宏展开时由预处理程序层层代换。 例如: #define PI 3.1415926 #define S PI*y*y /* PI是已定义的宏名*/ 若有语句: printf("%f",S); 则在宏代换后变为: printf("%f",3.1415926*y*y); 6) 习惯上宏名用大写字母表示,以便于与变量区别。
2. 函数及带参宏中的实参、形参比较: 带参宏定义中,形式参数不分配内存单元,因此不必作 类型定义;而实参要去代换形参,因此必须作类型说明。 函数中的形参与实参都应该作类型定义。 函数中要把实参值赋予形参,进行值传递。 在带参宏中,只是符号代换,不存在值传递的问题。
3. 在宏定义中,应适当地加上括号以避免出错。 【例9.6】 #define SQ(y) y*y 修改: void main() /*以宏的方式求某数的平方*/ #define SQ(y) (y)*(y) { int a,sq; printf("input a number:"); scanf("%d",&a); sq=SQ(a+1); printf("sq=%d\n",sq); 宏代换后变为: } sq=a+1*a+1;
9.5 本章小结
1.
2. 3. 4. 5. 6. 7.
再见!
预处理功能是C语言特有的功能,它是在对源程序正式编 译前由预处理程序完成的。程序员在程序中用预处理命令来调用 这些功能。 宏定义是用一个标识符来表示一个字符串,这个字符串可以 是常量、变量或表达式。在宏调用中将用该字符串代换宏名。 宏定义可以带有参数,宏调用时是以实参代换形参。而不是 “值传送”。 为了避免宏代换时发生错误,宏定义中应适当加上括号。 文件包含是预处理的一个重要功能,它可用来把多个源文件 连接成一个源文件进行编译,结果将生成一个目标文件。 条件编译允许只编译源程序中满足条件的程序段,使生成的 目标程序较短,从而减少了内存的开销并提高了程序的效率。 使用预处理功能便于程序的修改、阅读、移植和调试,也便 于实现模块化程序设计。
相关文档
最新文档