第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

预处理指令

预处理指令

9.1.2 有参宏定义
1.带参宏定义的一般格式 . #define 宏名 形参表 语言符号字符串 宏名(形参表 形参表) 2.带参宏的调用和宏展开 . 实参表) (1)调用格式:宏名 实参表 )调用格式:宏名(实参表 (2)宏展开:用宏调用提供的实参字符串,直接置换 )宏展开:用宏调用提供的实参字符串, 宏定义命令行中、相应形参字符串,非形参字符保持不变。 宏定义命令行中、相应形参字符串,非形参字符保持不变。 3.说明 . (1)定义有参宏时,宏名与左圆括号之间不能留有空 )定义有参宏时, 否则, 格。否则,C编译系统将空格以后的所有字符均作为替代 字符串,而将该宏视为无参宏。 字符串,而将该宏视为无参宏。 (2)有参宏的展开,只是将实参作为字符串,简单地 )有参宏的展开,只是将实参作为字符串, 置换形参字符串,而不做任何语法检查。在定义有参宏时, 置换形参字符串, 而不做任何语法检查。在定义有参宏时, 在所有形参外和整个字符串外,均加一对圆括号。 在所有形参外和整个字符串外,均加一对圆括号。
第9章
预处理命令
ห้องสมุดไป่ตู้
所谓预处理命令是指,在对源程序进行编译之前, 所谓预处理命令是指,在对源程序进行编译之前,先 对源程序中的编译预处理命令进行处理; 对源程序中的编译预处理命令进行处理;然后再将处理的 结果,和源程序一起进行编译,以得到目标代码。 结果,和源程序一起进行编译,以得到目标代码。 9.1 宏定义 9.2 文件包含 9.3 条件编译
9.3 条件编译
条件编译可有效地提高程序的可移植性, 条件编译可有效地提高程序的可移植性,并广泛地应 用在商业软件中,为一个程序提供各种不同的版本。 用在商业软件中,为一个程序提供各种不同的版本。 1.一般格式 . #if 常量表达式 程序段1; 程序段 ; [#else # 程序段2; 程序段 ;] #endif 2.功能:当表达式为非0(“逻辑真”)时,编译程序 .功能:当表达式为非 ( 逻辑真” 段1,否则编译程序段 。 ,否则编译程序段2。

第九章改 预处理命令习题答案

第九章改 预处理命令习题答案

第九章习题答案一、单项选择题1.A2.B3.C4.D5.B6.C7.A8.D9.D10.C11.B12.C13.D14.C二、填充题1.编译处理编译预处理2.非静态存储类型变量和外部函数3.74.printf(“%d\n”,m);5.fopen(“a.txt”,”rw”);6.x[i]>=’A’&&x[i]<=’Z’7.“ i=%d\n”8.(1) #define MAX(a,b,c)(2) #define MIN(a,b) (a<b?a:b)(3) #define isalnum(c) (c>=’0’&& c<=’9’)(4) #define isupper( c) (c>=’A’&& c<=’Z’)(5) #define islower( c) (c>=’a’ && c<=’z’)三、程序分析题1.运行结果: -32.运行结果: 7,473.运行结果:50 254.运行结果:x=9, y=55.运行结果:9 9 116.输出结果: x|y&z=3x^y&~z=1x&y&z=0!x|x=1~x|x=-1四、程序设计题1.解:#include <stdio.h>#include <math.h>#define S(a, b, c) 0.5* (a+b+c)#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)) void main ( ){ float a, b, c;printf (“输入三角形的三条边长:a, b, c\n”);scanf (“%f, %f, %f”, &a, &b, &c) ;if (( a+b>c)&& (b+c>a) && (c+a>b)){ printf (“周长=%f\n”, 2*S(a, b, c ));printf (“面积=%f\n”, AREA(a, b, c ));}else printf (“a, b, c 的长度不能构成三角形\n”) ;}2.解:#include <stdio.h>#include <stdlib.h>void main (int argc, char *argv[ ]){ int a, b;if (argc<3) { printf (“Parameter missing!\n”) ; exit(0); }a=atoi (argv[1]) ;b=atoi (argv[2]) ; //在stdlib.h中有库函数atoi, 把字符串转换成整数printf (“%5d + %5d = %5d\n”, a, b, a+b) ;printf (“%5d - %5d = %5d\n”, a, b, a-b) ;printf (“%5d * %5d = %5d\n”, a, b, a*b) ;printf (“%5d / %5d = %5d\n”, a, b, a/b) ;printf (“%5d %% %5d = %5d\n”, a, b, a%b) ;}3.解:#include <stdio.h>#include <stdlib.h>void main (int argc, char *argv[]){ int i, sum=0;for (i=1; i<argc; i++) sum=sum+atoi (argv[i]) ;printf (“和= %d\n”, sum);}4.解:#include <stdio.h>#include <stdlib.h>#include <string.h>void main (int argc, char *argv[]){ if (argc<3){ printf (“Parameter missing!\n”) ; exit(0); } if ( strcmp (argv[1], argv[2])>0) puts (argv[1]) ;else puts (argv[2]) ;}。

第9章预处理定义

第9章预处理定义
⑷宏定义不是C语句#d,ef不ine必a在rra行y_末siz加e 2分00号0,如果加了分号则 连分号一起进行置在换该。场合下array_size所代表的是2000, ⑸#define命令出现在使程用序宏函定数义的,外可面以,提宏高名程的序有的效通范用围性为。定 义命令之后到本源文件结束。
C语言程序设计(第三版) My email:chenguot@
area=S(a); printf(“r=%f\narea=%f\n”,a,area);
area=3.1415926*a*a;
}
C语言程序设计(第三版) My email:chenguot@
10
§9.1 宏定义(7)
如下宏定义:
说明:
#define S (r) PI*r*r
⑴对带参数的宏的展开只是将语对句于中语的句宏名后面括号内的实
file1.c 或
file2.c
#include<file2.c>
#include <文件名> B
A
file1.c
A B
C语言程序设计(第三版) My email:chenguot@
16
§将包9.宏含2代到表用“文输户出程件格序包式中做:含出”头文处件理,并(2) (2)主文件file1.c
(好1处):将“格文式件宏包做含成”头命文令件可fo以rm节at.省h 程序设计void人m员ain的() 重复劳动。
#如inc:lud某e <单std位io.的h>人员往往使用一组固定的符号{ 常量(g=9.81,
#pdie=fi3n.e1P4R15p9ri2nt6f,e=2.718,c=…),可以把这些宏int定a,b义,c,d命; 令组成 ##一量定ddeeff个包义iinnee头含这ND文到些L“%“件自符\dn””,己号然所常后写量各的,人源相都文当可件于以中工用。业这上#in样的cl每标ud个准e命人零令cah=就件a1将r;b可,s=t这r2i以拿n;cg些=[不来]3=;符d“必就C=4号H;重用IN常A复。”;

C语言-预处理命令

C语言-预处理命令

我们可以在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 \n”如果一个串长于一行,可在行尾用反斜线”\”续行,如下:#define LONG_STRING “This is a very very long \String that i s used as an example”3. #error#error指令强制编译程序停止编译,它主要用于程序调试。

#error指令的一般形式是:#error error-message注意,宏串error-message不用双引号包围。

1、预处理——精选推荐

1、预处理——精选推荐

1、预处理1、预处理命令的定义 使⽤库函数之前,应该⽤#include引⼊对应的头⽂件。

这种以#号开头的命令称为预处理命令。

所谓预处理是指在进⾏编译时的第⼀遍扫描(词法扫描和语法分析)之前所做的⼯作。

预处理是C语⾔的⼀个重要功能,它由于处理程序负责完成。

当编译⼀个程序时,系统将⾃动调⽤预处理程序对程序中“#”开头的预处理部分进⾏处理,处理完毕之后可以进⼊源程序的编译阶段。

C语⾔源⽂件要经过编译、链接才能⽣成可执⾏程序: (1)编译(Compile)会将源⽂件(.c⽂件)转换为⽬标⽂件。

对于 VC/VS,⽬标⽂件后缀为.obj;对于GCC,⽬标⽂件后缀为.o。

编译是针对单个源⽂件的,⼀次编译操作只能编译⼀个源⽂件,如果程序中有多个源⽂件,就需要多次编译操作。

(2)链接(Link)是针对多个⽂件的,它会将编译⽣成的多个⽬标⽂件以及系统中的库、组件等合并成⼀个可执⾏程序。

在实际开发中,有时候在编译之前还需要对源⽂件进⾏简单的处理。

例如,我们希望⾃⼰的程序在 Windows 和 Linux 下都能够运⾏,那么就要在 Windows 下使⽤ VS 编译⼀遍,然后在 Linux 下使⽤ GCC 编译⼀遍。

但是现在有个问题,程序中要实现的某个功能在 VS 和GCC 下使⽤的函数不同(假设 VS 下使⽤ a(),GCC 下使⽤ b()),VS 下的函数在 GCC 下不能编译通过,GCC 下的函数在 VS 下也不能编译通过,怎么办呢? 这就需要在编译之前先对源⽂件进⾏处理:如果检测到是 VS,就保留 a() 删除 b();如果检测到是 GCC,就保留 b() 删除 a()。

这些在编译之前对源⽂件进⾏简单加⼯的过程,就称为预处理(即预先处理、提前处理)。

预处理主要是处理以#开头的命令,例如#include <stdio.h>等。

预处理命令要放在所有函数之外,⽽且⼀般都放在源⽂件的前⾯。

预处理是C语⾔的⼀个重要功能,由预处理程序完成。

第九章 预处理命令

第九章 预处理命令

第九章 预处理命令一、选择题1.以下叙述不正确的是 。

A)预处理命令行都必须以#开始B)在程序中凡是以#开始的语句行都是预处理命令行C)C程序在执行过程中对预处理命令行进行处理D)预处理命令行可以出现在C程序中任意一行上2.以下叙述中正确的是 。

A)在程序的一行上可以出现多个有效的预处理命令行B)使用带参数的宏时,参数的类型应与宏定义时的一致C)宏替换不占用运行时间,只占用编译时间D)C语言的编译预处理就是对源程序进行初步的语法检查3.以下有关宏替换的叙述不正确的是 。

A)宏替换不占用运行时间B)宏名无类型C)宏替换只是字符替换D)宏名必须用大写字母表示4.在“文件包含”预处理命令形式中,当#include后面的文件名用””(双引号)括起时,寻找被包含文件的方式是 。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录5.在“文件包含”预处理命令形式中,当#include后名的文件名用<>(尖括号)括起时,寻找被包含文件的方式是 。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录6.在宏定义#define PI 3.1415926中,用宏名PI代替一个 。

A)单精度数B)双精度数C)常量D)字符串7.以下程序的运行结果是 。

#include<stdio.h>#define ADD(x) x+xvoid main ( ){ int m=1,n=2,k=3,sum ;sum = ADD(m+n)*k ;printf(“%d\n”,sum) ;A)9 B)10 C)12 D)188.以下程序的运行结果是 。

#include<stdio.h>#define MIN(x,y) (x)>(y) ? (x) : (y)void main ( ){ int i=10, j=15 , k;k = 10*MIN(i,j);printf(“%d\n”,k);}A)10 B)15 C)100 D)1509.以下程序的运行结果是 。

c#中预处理指令#if的使用

c#中预处理指令#if的使用

c#中预处理指令#if的使用c#中预处理指令#if的使用引导语:预处理(pre-treatment),是指在进行最后加工完善以前进行的准备过程,具体应用在不同的行业或领域,会有不同的解释,以下是店铺整理的预处理指令#if的使用,欢迎参考阅读!#if 使您可以开始条件指令,测试一个或多个符号以查看它们是否计算为true。

如果它们的计算结果确实为true,则编译器将计算位于#if 与最近的 #endif 指令之间的所有代码。

例如#define DEBUG// ...#if DEBUGConsole.WriteLine("Debug version");#endif可以使用运算符==(相等)、!=(不相等)、&&(与)及||(或)来计算多个符号。

还可以用括号将符号和运算符分组。

备注使用 #if 以及 #else、#elif、#endif、#define 和 #undef 指令,可以包括或排除基于由一个或多个符号组成的条件的代码。

这在编译调试版本的`代码或编译特定配置时最为有用。

以 #if 指令开始的条件指令必须用 #endif 指令显式终止。

#define 使您可以定义一个符号,通过将该符号用作传递给 #if 指令的表达式,使该表达式计算为 true。

也可以用/define 编译器选项来定义符号。

可以用#undef 来取消定义符号。

用 /define 或 #define 定义的符号与具有同一名称的变量不冲突。

即,不应将变量名传递到预处理器指令,并且只能用预处理器指令计算符号。

用 #define 创建的符号的范围是在其中定义该符号的文件。

示例// preprocessor_if.cs#define DEBUG#define VC_V7using System;public class MyClass{static void Main(){#if (DEBUG && !VC_V7)Console.WriteLine("DEBUG is defined");#elif (!DEBUG && VC_V7)Console.WriteLine("VC_V7 is defined");#elif (DEBUG && VC_V7)Console.WriteLine("DEBUG and VC_V7 are defined");#elseConsole.WriteLine("DEBUG and VC_V7 are not defined"); #endif}}DEBUG and VC_V7 are defined【c#中预处理指令#if的使用】。

第9章 预处理

第9章 预处理

C语言试题库(第9章)一、选择题1、宏定义#define PI 31.14159中,宏名PI代替______________。

A、浮点型B、整型C、常量D、字符串答案A 难度12、设有以下宏定义:#define N 3#define Y(n) ((N+1)*n)执行语句z=2*(N+Y(5+1));后,z的值为_____________。

A、出错B、42C、48D、54答案C 33、以下说法正确的是_____________。

A、#define和printf都是C语句B、#define 是C语句,而printf不是C、printf是C语句,但#define不是D、#define 和printf都不是C语句答案D 难度24、宏定义的宏展开是在__________阶段完成的。

A、第一遍编译B、第二遍编译C、程序执行D、预编译答案D 难度 15、编译预处理命令以___________结尾。

A、;B、.C、\D、回车答案D 难度16、以下叙述中正确的是________.a)在程序的一行上可以出现多个有效的预处理命令行b)使用带参的宏时,参数的类型应与宏定义时的一致c)宏替换不占用运行时间,只占用编译时间d)在以下定义中C R是称为“宏名”的标识符#define C R 045答案C 难度37、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 48、若有宏定义如下:#define X 5#define Y X+1#define Z Y*X/2则执行以下printf语句后,输出结果是_______.int a;a=Y;printf("%d\n",Z);printf("%d\n",a);a)7 b)12 c)12 d)76 6 5 5答案 A 难度 29、请读程序:#include <stdio.h></P< p>#define MUL(x,y) (x)*ymain(){int a=3,b=4,c;c=MUL(a++,b++);printf("%d\n",c);}上面程序的输出结果是__________.a)12 b)15 c)20 d) 16答案A 难度410、对下面程序段:#define A 3#define B(a) ((A+1)*a)...x=3*(A+B(7));正确的判断是_________.a)程序错误,不许嵌套宏定义b)x=93c)x=21d)程序错误,宏定义不许有参数答案 B 难度311、以下正确的描述是____________.a)C语言的预处理功能是指完成宏替换和包含文件的调用b)预处理指令只能位于C源程序文件的首部c)凡是C源程序中行首以"#"标识的控制行都是预处理指令d)C语言的编译预处理就是对源程序进行初步的语法检查答案C 难度212、在"文件包含"预处理语句的使用形式中,当#include后面的文件名用< >(尖括号)括起时,找寻被包含文件的方式是_______.a)仅仅搜索当前目录b)仅仅搜索源程序所在目录c)直接按系统设定的标准方式搜索目录d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索(双撇号的)答案 C 难度313、有以下程序#define F(X,Y)(X)*(Y)main(){ int a=3, b=4;printf("%d\n", F(a++, b++));}程序运行后的输出结果是()A)12 B)15 C)16 D)20 正确答案: A 难度414、以下叙述中不正确的是()A)预处理命令行都必须以#号开始B)在程序中凡是以#号开始的语句行都是预处理命令行C)宏替换不占用运行时间,只占编译时间D)在以下定义是正确的:#define PI 3.1415926;正确答案: D 难度 215、有如下程序:#define N 2#define M N+1#define NUM 2*M+1main(){ int i;for(i=1;i<=NUM;i++)printf("%d\n",i);}该程序中的for循环执行的次数是( )A)5 B)6 C)7 D)8 正确答案: B 难度416、以下程序的运行结果是( )#define MIN(x,y)(x)<(y)?(x):(y)main(){ int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}A)10 B)15 C)100 D)150正确答案: B 难度 117、有如下定义#define D 2int x=5;float y=3.83;char c=′D′;则下面选项中错误的是 ( )A)x++; B)y++; C)c++; D)D++;正确答案: D 难度 418、以下程序段的执行结果为 ( )#define PLUS(X,Y)X+Ymain(){ int x=1,y=2,z=3,sum;sum=PLUS(x+y,z)*PLUS(y,z);printf("SUM=%d",sum);}A)SUM=9 B)SUM=12 C)SUM=18 D)SUM=28 正确答案: B 难度 319、下列程序的输出结果是 ( )#include "stdio.h"#defineM(x,y)x%ymain(){ int a,m=12,n=100;a=M(n,m);printf("%d\n",a--);}A)2 B)3 C)4 D)5 正确答案: C 难度420 、阅读下列程序段,则程序的输出结果为 ( )#include "stdio.h"#define M(X,Y)(X)*(Y)#define N(X,Y)(X)/(Y)main(){ int a=5,b=6,c=8,k;k=N(M(a,b),c);printf("%d\n",k);}A)3 B)5 C)6 D)8 正确答案: A 难度221、已知#define M 2;的宏定义,执行语句k=M*5;后,k的值是 ( )A)10 B)5 C)2 D)以上答案都不对正确答案: D 难度122、以下关于宏替换叙述中,错误的是 ( )A)宏替换占用编译时间 B)替换文本中可以包含已定义过的宏名C)宏名可以由+号组成 D)宏替换只能是字符替换正确答案: D 难度 223、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 224、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()A)函数调用可以作为独立的语句存在B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中D)函数调用可以作为一个函数的形参正确答案: D 难度125、以下正确的说法是()A)定义函数时,形参的类型说明可以放在函数体内B)return后边的值不能为表达式C)如果函数值的类型与返回值类型不一致,以函数值类型为准D)如果形参与实参类型不一致,以实参类型为准正确答案: C 难度226、以下正确的说法是()A)用户若需调用标准库函数,调用前必须重新定义B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义C)系统根本不允许用户重新定义标准库函数D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动调用正确答案: B 难度127、以下叙述正确的是()A)函数可以嵌套定义但不能嵌套调用B)函数既可以嵌套调用也可以嵌套定义C)函数既不可以嵌套定义也不可以嵌套调用D)函数可以嵌套调用但不可以嵌套定义正确答案: D 难度128、以下程序有语法错误,有关错误原因的正确说法是()main(){ int G=5,k;void prt_char();...k=prt_char(G);...}A)语句 void prt_char();有错,它是函数调用语句,不能用void说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线正确答案: C 难度 329、以下正确的函数头定义形式是()A)double fun(int x,int y)B)double fun(int x;int y)C)double fun(int x,int y);D)double fun(int x,y);正确答案: A 难度230、以下所列的各函数首部中,正确的是()A)void play(var :Integer,var b:Integer)B)void play(int a,b)C)void play(int a,int b)D)Sub play(a as integer,b as integer)正确答案: C 难度131 下面函数调用语句含有实参的个数为()func((exp1,exp2),(exp3,exp4,exp5));A)1B)2C)4D)5正确答案: B 难度432、有以下程序float fun(int x,int y){ return(x+y);}main(){ int a=2,b=5,c=8;printf("%3.0f\n",fun((int)fun(a+c,b),a-c));}程序运行后的输出结果是()A)编译出错B)9C)21D)9.0正确答案: B 难度233、下列程序执行后的输出结果是()void func1(int i);void func2(int i);char st[]="hello,friend!";void func1(int i){ printf("%c",st[i]);if(i<3) { i+=2;func2(i);}}void func2(int i){ printf("%c",st[i]);if(i<3) { i+=2;func1(i);}}main(){ int i=0; func1(i); printf("\n");}A)helloB)helC)hloD)hlm考生答案: 正确答案: C34、下列函数的运行结果是()main(){ int i=2,p;int j,k;j=i;k=++i;p=f(j,k);printf("%d",p);}int f(int a,int b){ int c;if(a>b) c=1;else if(a==b) c=0;else c=-1;return(c);}A)-1B)1C)2D)编译出错,无法运行正确答案: A 难度335、有以下函数 char * fun(char *p) { return p; } 该函数的返回值是()A、无确切的值B、形参p中存放的地址值C、一个临时存储单元的地址D、形参p自身的地址值正确答案:B 难度 136、下面程序应能对两个整型变量的值进行交换。

二级c语言第九章预处理命令

二级c语言第九章预处理命令

如果在程序中有下面的语句: R1=Radium(100); 那么,在编译预处理时,宏展开的顺序为从左到右进行置换,如果字符串 中包含宏中的形参,则将其用程序语句中相应的实参来替代,而字符串中的 其它字符原样保留。 因此,在处理上述语句时,将用 sqrt(area/PI) 替代 Radium(100),同时将 字符串sqrt(area/PI)中的形参area用实参l00来替代,并把已定义的宏PI的值代 入,经宏展开后,该语句变为“ R1=sqrt(100/3.14159); ”。
内蒙古科技大学 工程训练中心
预处理命令概述
所谓预处理,就是指源程序被正式编译之前所进行的处理工作,这 是C语言和其他高级语言之间的一个重要区别。
所有的预处理指令均以“#”开头,在它前面不能出现空格以外的字 符,而且在行结尾处没有分号。 “预处理命令” 的作用不是实现程序的功能,它们是发布给编译系 统的信息。它们告诉编译系统,在对源程序进行编译之前应该做些什么, 所以称这类语句为编译预处理命令。 C语言在执行一个C程序时,如果程序中有预处理命令,则首先进行 编译预处理(即根据预处理命令对源程序进行预先处理),然后再将经过 预处理的源程序编译成目标文件,而后进行目标文件的连接,当这些工 作都顺利通过后,才最终执行目标代码。这种执行过程大大提高了编程 效率。
PI 的有效范围
因为#undef 的作用是终止宏定义,因此PI的作用域从它定义开始到 #undef结束。在这以后,如果程序中出现 PI,则它不代表3.14159 。使 用#undef可以灵活控制宏定义的作用范围。
2019年1月8日5时29分 工程训练中心 徐国海
(二)带参数宏定义 (了解) 定义的一般格式为: #define 宏名(形式参数列表) 字符串

C语言9

C语言9

第 九 章 编 译 预 处 理
7-1
宏定义 不带参数的宏定义 带参数的宏定义
7-1-1 7-1-2
7-2
7-3
文件包含
条件编译
9-1
宏定义
例9-1 请看下面的程序: #define PI 3.14159 main() {float r,l,s; scanf("%f",&r); l=2*PI*r; s=PI*r*r; printf("l=%7.2f,s=%7.2f\n",l,s); } 程序的第一行内容:#define PI 3.14159 就是一个宏定义,PI 称为宏名,其作用是用标识符PI代表3.14159这样一串字符。在此之后 的程序中就可以用标识符PI代替3.14159,称为宏引用。 预处理时,程序中的PI 将被所定义的串3.14159替换,称为宏展开 或宏替换,如程序中的语句:l=2*PI*r;和s=PI*r*r;中的宏展开后分别 为:l=2*3.14159*r;和s=3.14159*r*r;。 有两种形式的宏 :不带参数的宏和带参数的宏。
9-2
文件包含(1)
一个C 程序由若干个源程序组成,而一个源文件还可以将另一个源 文件的全部内容包含进来,即将指定源文件的内容包含在当前文件中。 例如有两个源文件file1.c和file2.c,文件的内容分别如下: file1.c的内容: int max(int x,int y) {int z; if(x>y) z=x; else z=y; return z; } file2.c的内容: #include "file1.c" main() {int a,b,c; scan("%d,%d",&a,&b); c=max(a,b); printf("c=%d\n",c); }
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可缺省,表示宏名 可缺省, 定义过或取消宏体
第 十 章
预 处 理 命 令
后面的单词串 容文本 #define SIZE 10 如 #define YES 1 #define INT_STR "%d" void main ( ) #define NO 0 void main ( ) { #define PI 3.1415926 { int a[10], i; a[10], 宏定义 #define OUT printf(“Hello,World”); int a[SIZE], i; a[SIZE], for (i = 0; i < 10; i++) 10; for (i = 0; i < SIZE; i++) SIZE; scanf ("%d", &a[i]); ("%d", scanf (INT_STR, &a[i]); (INT_STR, 预编译 for (i = 10 - 1; i >= 0; i--) i--) for (i = SIZE - 1; i >= 0; i--) i--) 处理后 printf ("%d", a[i]); ("%d", printf (INT_STR, a[i]); (INT_STR, } }
a = 3.14; * 2 * 2;
错误! 错误!
第 十 章
预 处 理 命 令
{ N的内容是10 的内容是10 #define NUM2 20 { return (N * N); #define NUM (NUM1 + NUM2) int a = 2, b = 3; } void main ( ) a *= ( + 20) ; 10 { b = b * ( + 20) ; 10 //第二次宏定义 int a = #define N 20 //第二次宏定义 2, b = 3; printf ("a = %d, b = %d\n", a, b); %d\ void a *= NUM; main ( ) NUM; } { N的内容是20 的内容是20 b = b * NUM; NUM; printf ("%d%d\ N + f )); ("%d\n", \ printf ("a = %d, b = %d\n", a, (b); 预编译 输出结果: 输出结果: } 处理后 } a = 60, b = 50 90
第 十 章
预 处 理 命 令
本章主要讨论的 内容! 内容!
C
语 言 程 序 设 计 教 程
9.2 宏定义
宏定义分为两种:不带参数的宏定义和带参数的宏定义。 宏定义分为两种:不带参数的宏定义和带参数的宏定义。 1、不带参数的宏定义 一般形式 #define 标识符 单词串 注意:宏替换时仅仅是将源程序中与宏名相同的 注意:宏替换时仅仅是将源程序中与宏名相同的 标识符替换成宏的内容文本,并不对宏的内容文本做 功能 任何处理。 宏名, 宏名,被定义代表 ,是宏的内 宏体, 宏体 指令名称 用指定标识符(宏名)代替字符序列(宏体) 用指定标识符(宏名)代替字符序列(宏体)
z=POWER(x+y); 宏展开: 宏展开: z=x+y*x+y; 一般写成: 一般写成: #define POWER(x) ((x)*(x)) 宏展开: 宏展开: z=((x+y)*(x+y));
第 十 章
预 处 理 命 令
PI*r*r”
C
语 言 程 序 设 计 教 程
【例】用宏定义和函数实现同样的功能 #define MAX(x, y) (x)>(y)?(x):(y) ……. void main ( ) { int a, b, c, d, t; ……. t = MAX(a+b, c+d); …… } 宏展开: 宏展开:t ቤተ መጻሕፍቲ ባይዱ (a+b)>(c+d)?(a+b):(c+d); int max(int x,int y) { return(x > y ? x : y); } void main ( ) { int a, b, c, d, t; ……. t = max(a+b, c+d); ……… }
C
语 言 程 序 设 计 教 程
宏定义注意事项
C程序员通常用大写字母来定义宏名,以便与变量名区别。 程序员通常用大写字母来定义宏名,以便与变量名区别。 大写字母来定义宏名 宏定义的位置任意 PI一般放在函数外面。 宏定义的位置任意,但一般放在函数外面。 3.14159 如位置任意, : #define 宏定义时,如果单词串太长,需要写多行, 宏定义时,如果单词串太长,需要写多行,可以在行尾 使用反斜线“ 使用反斜线“\”续行符 宏名的作用域是从#define定义之后直到该宏定义所在 宏名的作用域是从 例如: 作用域是从#define定义之后直到该宏定义所在is\ 例如:#define LONG_STRING "this is a very long string that is\ 文件结束 example" used as an #define YES 1 #undef可 #undef可终止宏名作用域
void main ( ) #undef 标识符 { YES原作用域 YES原作用域 …….. 宏定义可以嵌套定义 嵌套定义, 宏定义可以嵌套定义,但不能递归定义 } 程序中字符串常量即双引号中的字符, 程序中字符串常量即双引号中的字符,不作为宏进行宏 #undef #define R YES 2.0 替换操作 #define M M + 10 (×) #define 3.14159 #define PI YES 0 void max ( ) #define XYZ this is a (√) #define L 2*PI*R testYES新作用域 { YES新 printf("XYZ"); …….. #define S PI*R*R (√) (√ 输出:XYZ,而不是: test。 输出:XYZ,而不是:this is a test。 }
第 十 章
运行速度 不占运行时间
预 处 理 命 令
C
语 言 程 序 设 计 教 程
9.3 文件包含
功能 一个源文件可将另一个源文件的内容全部包含进来 一般形式
#include <包含文件名> 或 #define “包含文件名” <包含文件名 包含文件名> “包含文件名 包含文件名”
处理过程
< >: 直接到系统指定的 “ ”:系统首先到当前目录 预编译时,用被包含文件的内容取代该预处理命令, 预编译时,用被包含文件的内容取代该预处理命令,再 文件包含目录” “文件包含目录”去查 下查找被包含文件, 下查找被包含文件,如果 对“包含”后的文件作一个源文件编译 再到系统指定的 包含” 找被包含的文件 没找到, 没找到,再到系统指定的 “文件包含目录”去查找。 文件包含目录”去查找。 #include "prg1.cpp" 预编译 处理后 < >: 直接到系统指定的
C
语 言 程 序 设 计 教 程
2、带参数的宏定义 一般形式
不能加空格
#define 标识符(参数列表) 标识符(参数列表)
单词串
例: #define S(a, b) a*b 参数只有参 通常会引用 参数表由一个或多个参数构成, 参数表由一个或多个参数构成, ……….. 宏的参数 数名,没有数据类型符,参数之间用逗号隔 数名,没有数据类型符,参数之间用逗号隔 开,参数名必须是合法的标识符 area = S(3, 2); 宏展开: area=3*2; 宏展开: 宏展开:形参用实参换, 宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号() 宏体及各形参外一般应加括号() 例 例 #define SPOWER(x) x*x #define (r) PI*r*r x=4; y=6; 相当于定义了不带参宏S 代表字符串“ 相当于定义了不带参宏S,代表字符串“(r)
第 十 章
预 处 理 命 令
C
语 言 程 序 设 计 教 程
学习的意义
源程序生成执行文件的过程: 源程序生成执行文件的过程: 语 言 源 程 序 .c或 .c或.cpp 目 标 程 序 执 行 程 序 .exe C C C C C C C C
.obj
第 十 章
预 处 理 命 令
#include <stdio.h> #define PI 3.14159 void main ( ) { float r = 4; printf (“s = %f\n”, PI*r*r); %f\ }
学习内容
第 十 章
预 处 理 命 令
预处理命令简介 宏定义 不带参数的宏定义 带参数的宏定义 文件包括 条件编译 本章小结
C
语 言 程 序 设 计 教 程
9.1 预处理命令简介
预处理命令:C源程序中以#开头、以换行符结尾的行 预处理命令: 源程序中以#开头、 种类: 种类: #define、 #define、#undef 宏定义 #include 文件包含 #if、#ifdef、#else、#elif、#endif等 #if、#ifdef、#else、#elif、#endif等 条件编译 #line、#error、#program等 #line、#error、#program等 其他 格式: 格式: “#”开头 “#”开头 占单独书写行 语句尾不加分号
第 十 章
预 处 理 命 令
C
语 言 程 序 设 计 教 程
宏定义注意事项
宏定义一般以换行结束 不要用分号结束, 宏定义一般以换行结束,不要用分号结束,以免引起不 换行结束, 必要的错误 #define PI 3.14; a = PI * 2 * 2; 宏可以被重复定义 宏可以被重复定义。 重复定义。
相关文档
最新文档