C语言学习 第九章 预处理命令

合集下载

c语言预处理命令之条件编译(ifdefelseendifif等)

c语言预处理命令之条件编译(ifdefelseendifif等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。

可见预处理过程先于编译器对源代码进行处理。

在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。

要完成这些工作,就需要使用预处理程序。

尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。

预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。

预处理过程还会删除程序中的注释和多余的空白字符。

预处理指令是以#号开头的代码行。

#号必须是该行除了任何空白字符外的第一个字符。

#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。

整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。

包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。

标准C编译器至少支持八重嵌套包含。

预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。

这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。

例如:#defineAAA#include"t.c"#undefAAA#include"t.c"为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。

⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。

3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。

只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。

如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。

第九章预处理命令(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中就已经有了,但是考虑到兼容性并没有太多的使用它。

预处理命令

预处理命令

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语言程序设计 第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

C语言910章

C语言910章

C语言教案第九章预处理命令1.C语言中以“#”号开头的行,均为“编译预处理”命令行2.宏作为一个预处理命令,只是简单的文本代换3.在字符串代换过程中,一定要注意不要添加任何字符4.不带参数的宏定义及使用,注意宏中括号的用法5.*当宏定义在一行中写不下,需换行时应在最后一个字符后加“\”6.带参数的宏定义及使用7.注意宏名一般使用大写字母,而参数则不限8.文件包含的两种方法(书上212页)9.*条件编译习题217页:2,3,5第十章指针1.地址和指针的概念,指针型变量的定义2.指针型变量的基类型3.取地址运算符& 和指针运算符*4.通过指针为变量赋值及通过指针找出变量的值的方法5.*为指针变量赋“空”值:p=NULL或p=’\0’ 或p=0(NULL为预定义符,ASCII码值为0)6.函数的形参为指针变量时的数据传递7.通过传送地址值,在被调函数中直接改变主调函数中变量的值8.*函数返回地址值9.指针变量取代数组作函数参数10.一维数组与指针11.一维数组中的几种等价形式:设有定义int a[10], *p=a;数组元素的地址——&a[i], a+i, p+i, &p[i]数组元素——a[i], *(a+i), *(p+i), p[i]12.移动指针,每次移动一个单元13.*指针比较,通常两个或多个指针指向同一目标时比较才有意义14.*数组元素的地址作实参15.*函数的指针形参与函数体中数组的区别16.二维数组与指针17.一个二维数组可看作由多个一维数组构成18.几种等价形式:设有定义int a[5][6], *p=a[0]; 则存在着关于变量和变量的地址间的如下等价形式二维数组元素的地址——&a[i][j], a[i]+j, *(a+i)+j, &a[0][0]+列数*i+j,a[0]+列数*i+j 二维数组元素——a[i][j], *(a[i]+j), *(*(a+i)+j), *(&a[0][0]+列数*i+j),(*(a+i))[j]19.指向指针的指针:int a[5][6], **p=a;20.指针数组:int a[5][6], *p[4]; 定义了具有四个元素的基本整型指针数组21.行指针:int a[5][6], (*p)[6]; 定义了一个指向具有六个元素的一维数组的指向指针的指针型变量22.*二维数组名和指针数组作为实参在函数中的数据传递23.*二级指针和行指针作为实参在函数中的数据传递24.*字符串与指针,直接用字符型指针变量记录字符串的地址25.*指向函数的指针习题278页:2,3,4,9,10,14,15。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这里MAX不是函数 是带参数的宏 比用函数调 不是函数,是带参数的宏 这里 不是函数 是带参数的宏,比用函数调 用简单。 用简单。 问:用MAX函数如何作上题? 函数如何作上题? 函数如何作上题
#include <stdio.h> int max(int x,int y) {int z; z=x>y?x:y; return(z); } main( ) {int a,b,c,d,t; printf("input a,b,c,d:\n"); scanf("%d,%d,%d,%d",&a,&b,&c,&d); t=max(a+b,c+d); /*调用 调用max函数 函数*/ 调用 函数 printf("max=%d",t); }
C提供的预处理功能有三种: 提供的预处理功能有三种:
宏定义. 包含文件. 1.宏定义.2.包含文件. 3.条件编 了解) 译(了解) 了解
9.1 宏定义
9.1.1 不带参数的宏定义
用途 :用一个指定的标识符来代表一个字符串 用一个指定的标识符来代表一个字符串 #define 标识符 字符串 例如: #define PI 3.14159 例如 标识符------称为宏名(PI) 称为宏名 标识符 称为宏名( 预编译时将宏名换成字符串-----称为宏展开 称为宏展开 预编译时将宏名换成字符串 称为 其中 : #define 是表示宏定义命令 #是通信标志,调用预编译程序。 是通信标志, 是通信标志 调用预编译程序。
复习
c的变量从作用域和存在的时间分有哪些类别 的变量从作用域和存在的时间 有哪些类别? 存在的时间分
1 从作用域分: 从作用域分:
自动变量( 自动变量(auto),即动态局部变量 ,
局部变量
(离开函数,值消失) 离开函数,值消失) 静态局部变量 (离开函数,值仍保留) 离开函数,值仍保留) 寄存器变量 离开函数,值消失) (离开函数,值消失) 静态外部变量(static) (限本文件引用) 静态外部变量 限本文件引用) 非静态外部变量
宏定义与函数都要求实参与形参数目相等, 宏定义与函数都要求实参与形参数目相等, 但是两者是不同的 比较如下: 两者是不同的, 但是两者是不同的,比较如下: 宏定义 函数 1.宏定义只是进行简单的字符替 宏定义只是进行简单的字符替 #define PI 3.1415926 1.函数调用时 将实参的值传递 函数调用时,将实参的值传递 函数调用时 换 给形参 #define CIRCLE(R,L,S,V) L=2*PI*R S=PI*R*R 2.宏展开是在编译时进行 只进行 宏展开是在编译时进行,只进行 宏展开是在编译时进行 2.函数调用是在程序运行时处 函数调用是在程序运行时处 字符替换,没有值的传递和返回 字符替换 没有值的传递和返回 V=4.0/3.0*PI*R*R*R 理
printf("S=%f" , 3.14159*3.0*3.0); 宏名分配内存空间 7. 系统不给宏名分配内存空间,它与变量定 系统不给宏名分配内存空间, 义不同。 义不同。
在进行字符串替换的同时,还进行参数的替换。 在进行字符串替换的同时,还进行参数的替换。 字符串替换的同时 例1: : #include <stdio.h> 执行时, 执行时,把 r 的值 # define PI 3.14159 的值。 送a,再求 的值。 ,再求s的值 # define S(a) PI*a*a 在对带参数的宏定 main( ) 义展开置换时, 义展开置换时,用 {float area,r; 实参从左到右置换 printf("请输入圆的半径 请输入圆的半径"); 请输入圆的半径 形参, 形参,其它非参数 scanf("%f",&r); 字符保留不变。 字符保留不变。 area=S(r); printf("r= %f,圆面积 圆面积s=%f ",r,area); 圆面积 }
8.11 如何运行一个多文件的程序 1. 用VC6.0集成环境 集成环境: 集成环境 1.将file1.c、 file2.c、 file3.c 分别编辑存盘。 将 分别编辑存盘。 、 、 2.将三个文件添加到一个工程中,进行编 将三个文件添加到一个工程中, 将三个文件添加到一个工程中 连接,运行即可。 译,连接,运行即可。
2. 用#include 命令 包含在file3.c中运行。 中运行。 将file1.c file2.c包含在 包含在 中运行 #include “file1.c” #include “file2.c” main( )
第9章 章
预处理命令
C语言程序在运行之前要进行编译,而 语言程序在运行之前要进行编译, 语言程序在运行之前要进行编译 编译系统包括:预处理、编译、连接等部分。 编译系统包括:预处理、编译、连接等部分。 所谓编译预处理, 所谓编译预处理,在C编译系统对程序 编译前, 编译前,先对程序中的某些特殊命令进行 预处理” 这些预处理命令用“ “预处理”,这些预处理命令用“#”号开 头.
5. 宏定义只是用宏名代替一个字符串,只作 宏定义只是用宏名代替一个字符串, 简单的置换,不作正确性检查。 简单的置换,不作正确性检查。 #define M o.05456 6. 程序中双引号“ ” 中的字符串即使与宏 程序中双引号“ 名相同,也不置换。 名相同,也不置换。 如: printf(“S=%f”,S); 置换为
2. 在宏定义时,宏名与括号之间没有空格。 在宏定义时,宏名与括号之间没有空格。 例如: 例如 #define S (r) 3.14*r*r
area=S (a); 展开为: 其中 area展开为: 展开为 area=(r) 3.14*r*r (a); 这是错误的
宏中的参数和宏名一样无类型。 宏中的参数和宏名一样无类型。 它们不是变量,只是一个符号代表, 它们不是变量,只是一个符号代表, 代入指定字符即可。 代入指定字符即可。 展开PI*3.5*3.5,r不 如:s(r) 中s(3.5)展开 展开 , 不 是变量,不必定义类型。 是变量,不必定义类型。
已知宏定义 #define N 3 #define Y(n) ((N+1)*n) 执行语句z=2*(N+Y(5+1));后, 执行语句 ; 变量z的值是 的值是____。 变量 的值是 。 A) 42 B) 48 C) 52 D) 出错 B
9.2 宏包含
一个源文件可以将另外一个源文件的全部 内容包含进来 一般形式: 一般形式 #include " 文件名 " 或 #include <文件名 文件名> 文件名 例如: #include "file2.c " 例如
file1.c
#include “file2.c” A B A
file2.c
file1.c
B 将文件file2.c的全部 的全部 将文件 内容复制到这条命令 处,并和以下的程序 并和以下的程序 一起作为一个整体进 行编译
一个文件可被多个文件包含, 一个文件可被多个文件包含,从而大大减 少编程工作。 少编程工作。可以把一些常用的函数放在 一个文件中,其他源文件都可以应用。 一个文件中,其他源文件都可以应用。 file1.c #include “file3.c” … file2.c #include “file3.c” … file3.c …
如:#define M 10 main( ) { : } fun( ) { :
}
有 效 范 围
加#undef M
有 效 范 围
4.宏定义可以嵌套 宏定义可以嵌套 即定义宏名时可以用已定义的宏名。 即定义宏名时可以用已定义的宏名 如: #define R 5.0 #define PI 3.14159 #define S PI*R*R
3.函数的参数要定义类型 函数的参数要定义类型 4.调用只能得到一个值 调用只能得到一个值 5.函数调用不会使源程序的长 函数调用不会使源程序的长 度增长 6.函数调用占运行时间 函数调用占运行时间
3.宏名没有类型 符号 4.宏可以得到多于一个的值 宏可以得到多于一个的值 5.宏展开会使程序增长 宏展开会使程序增长 6.宏替换不占运行时间 宏替换不占运行时间, 宏替换不占运行时间 只占编译时间
下面程序的输出是 D A) 3 B) 4 C) 6 D) 9
#include <stdio.h> fun3(int x) { static int a=5; a+=x; return(a);} main() { int k=3, m=1, n; n=fun3(k); n=fun3(m); printf("%d\n",n);}
说明: 说明: 1. 一个 include 命令只能指定一个包含文 一个# 几个文件要用几个# 件。几个文件要用几个 include. 2. 包含文件可以嵌套,即文件 包含文件 2, 包含文件可以嵌套,即文件1包含文件 文件2包含文件 包含文件3 文件 包含文件 嵌套的两种处理: 嵌套的两种处理: (1)将文件 包含在 中,文件 包含在文件 中 将文件2包含在 包含在文件2中 将文件 包含在1中 文件3包含在文件 file1.c file2.c file3.c
全局变量 外部变量 (extern) (允许其它文件引用) 允许其它文件引用)
2 从变量存在的时间分: 从变量存在的时间分:
自动变量 本函数内有效) (本函数内有效) 动态存储 寄存器变量 形参 函数内有效) (函数内有效) 静态局部变量 本文件内有效) 静态存储 静态外部变量 (本文件内有效) 其它文件可引用) (其它文件可引用) 外部变量
如: #define M 11, N 6 #include <stdio.h> main( ) #define M 10 { int cj[M][N], i; main() {int a[M],i; 预编译时,程序中所有的M 预编译时,程序中所有的M要 for(i=0;i<M;i++) 替换。 被10替换。这样在改变数组的 替换 scanf(“%d”, &a[i]);} “ ” 个数,只需改变M的值, 个数,只需改变M的值,其它 均不需要修改。 均不需要修改。 说明: 说明: 宏名一般用大写。 1.宏名一般用大写。 宏名一般用大写 宏定义不是C 2.宏定义不是C语句,不加“;”号。 宏定义不是 语句,不加“ 宏的有效命令范围为从定义命令后, 3.宏的有效命令范围为从定义命令后,到文件结束。 宏的有效命令范围为从定义命令后 到文件结束。 若用# 命令,可在给出该命令处, 若用#undef 命令,可在给出该命令处,终止宏的作 用域。 用域。
相关文档
最新文档