高级变量类型与宏定义
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序实例如下:
源程序: #define INTEGER #ifdef INTEGER int add(int x,int y)//有效 { return x+y; } #else float add(float x,float y) { return x+y; } #endif
void main() { #ifdef INTEGER int a,b,c; scanf("%d%d",&a,&b); printf("a+b=%d\n",add(a,b)); #else float a,b,c; scanf("%f%f",&a,&b); printf("a+b=%f\n",add(a,b)); #endif }
a= SQRT(2+3)
void main() { float a=-2.5,b=-3.2; a=(((a)>(b))?(a):(b))+3; printf("sqrt=%f\n",(a)*(a)); }
注意:
在定义带参数的宏时,宏名与圆括号之间不能有 空白符,否则就会变成定义一个不带参数的宏, 而要替换的内容是空白符之后的所有字符,从而 出错。例如 #define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r”。
预编译处理后的程序
int add(int x,int y) { return x+y; } void main() { int a,b,c; scanf("%d%d",&a,&b); printf("a+b=%d\n",add(a,b)); }
3.#ifndef~#endif
#ifndef 宏名 程序段1 #else 程序段2 #endif 与第2种形式的区别仅在于:如果宏名没有被定义,则编 译程序段1,则编译程序段2。 条件编译与分支语句不能混为一谈,二者之间的差别: 条件编译是在预编译时处理;而条件语句则是在程序运 行时处理。 条件编译中的条件不可以包含变量名,只能是常量表达 式(通常包含宏名),可以不加括号;而条件语句中的 条件是条件表达式,可以包含变量或函数等,并且必须 加括号。
#define SQRT(x) ((x)*(x)) #define MAX(x,y) (((x)>(y))?(x):(y)) void main() { 问如果有以下宏定义,问a的 float a=-2.5,b=-3.2; a=MAX(a,b)+3; 值是多少? printf("sqrt=%f\n",SQRT(a)); #define SQRT(x) (x*x) }
输出结果是a=60,b=50
2、带参数的宏定义
带参数的宏定义一般格式: #define 标识符(参数列表) 字符串 其中: (1)参数表由一个或多个参数构成,参数只 有参数名,没有数据类型符,参数之间用逗号 隔开,参数名必须是合法的标识符。 (2)字符串是宏的内容文本,也称为宏体, 其中通常会引用宏的参数。
文件包含两种格式
1)使用尖括号<>:直接到系统指定的“文件包含目 录去查找被包含的文件。 2)使用双引号” ”:系统首先到当前目录下查找被 包含文件,如果没找到,再到系统指定的“文件包 含目录”去查找。一般情况下,使用双引号比较保 险。 注意 ” ”之间可以指定包含文件的路径。如 #include”c:\\prg\\p1.h”表示将把C盘prg目录下的 文件p1.h的内容插入到此处(字符串中要表示‘\’, 必须使用‘\\’)。
N的作用域(有效范围)
(5)宏定义可以嵌套定义,但不能递归定义。例如下 列嵌套定义是正确的: #define R 2.0 #define PI 3.14159 #define L 2*PI*R #define S PI*R*R 在编译预处理时,宏L被2*3.14159*2.0替换,宏S被 3.14159*2.0*2.0替换。但下面的宏定义是错误的: #define M M+10 //不可递归定义宏 (6)程序中字符串常量即双引号中的字符,不作为宏 进行宏替换操作。例如: #define XYZ this is a test printf("XYZ"); 此时输出的将是XYZ,而不是this is a test。
预编译处理后的程序
char *currency="dollar"; void main() { float price1,price2,sumprice; scanf("%f%f",&price1,&price2); sumprice=price1+price2; printf("sum=%.2f%s",sumprice,currency); }
四、条件编译
条件编译有几种常用 的形式, 1.#if--#endif形式 #if 条件1 程序段1 #elif 条件2 程序段2 。。。 #else 程序段n #endif
其作用是: 如果条件1为真 就编译程序段1, 否则如果条件2为真 就编译程序段2,…, 如果各条件都不为真 就编译程序段n。
ຫໍສະໝຸດ Baidu
说明:
三、 文件包含
文件包含是指,一个C源程序通过#include命
令将另一个文件(通常是.c、.cpp或.h文件)的 全部内容包含进来。 文件包含处理命令的一般格式为: #include<包含文件名> 或 #include“包含文件名” 预编译器是这样来处理#include命令的:将包 含文件的内容插入到源程序中#include命令的 位置,以形成新的源程序。
#include "head.h" #include "func.cpp" void main() { int a,b,c; a=getnum(); b=getnum(); c=max(max(a,b),NUM); printf("MAX=%d\n",c); }
#include<stdio.h> #define NUM 10 void main() int max(int x,int y) { { int a,b,c; return (x>y ?x :y); a=getnum(); } b=getnum(); int getnum( ) c=max(max(a,b),NUM); { int a; printf("MAX=%d\n",c); scanf("%d",&a); } return a; }
(9)在定义宏时,如果宏是一个表达式,那么一定要将这个表 达式用()括起来
#define X 10 #define Y 20 #define Z X+Y void main() { int a=2,b=3; a*=Z; b=b*Z; printf("a=%d,b=%d\n", a,b); }
void main() { int a=2,b=3; a*=10+20; b=b*10+20; printf("a=%d,b=%d\n", a,b); }
文件包含实例
head.h #include<stdio.h> #define NUM 10 func.cpp int max(int x,int y) { return (x>y ?x :y); } int getnum( ) { int a; scanf("%d",&a); return a; }
void main() { double r,s; scanf("%lf",&r); s=3.1415*r*r; printf("s=%f\n",s); }
注意:
1)宏替换时仅仅是将源程序中与宏名相同的标识符替换 成宏的内容文本,并不对宏的内容文本做任何处理。 2)C语言程序员通常用大写字母来定义宏名,以便与变 量名相区别。 3)宏定义时,如果字符串太长,需要写多行,可以在行 尾使用反斜线“\”续行符。例如: #define LONG_STRING "this is a very long \ string that is used as an example" 注意双引号包括在替代的内容之内。
C语言源程序中以#开头、以换行符结尾的行 称为预处理指令。预处理指令不是C语言的 语法成分,而是传给编译程序的各种指令。
1
预处理命令简介 宏定义 文件包含 条件编译
2
一、预处理命令
C语言源程序中以#开头、以换行符结尾的行称为预处 理指令。预处理指令不是C语言的语法成分,而是传 给编译程序的各种指令。 (1)宏定义 (2)文件包含 #define #include #undef (3) 条件编译 (4) 其他 #if #line #ifdef #error #else #pragma #elif #endif
4)宏名的作用域是从#define定义之后直到该 宏定义所在文件结束,但通常把#define宏定义 放在源程序文件的开头部分。如果需要终止宏 的作用域,可以使用#undef命令,其一般格式 是: #undef 标识符
1 #define N 100 //宏定义 2 3 int sum() 4{ 5 int i,s=0; 6 for(i=1;i<=N;i++) 7 s+=i; 8 return(s); 9} 10 11 #undef N //宏取消 12 13 void main() 14 { 15 int a; 16 a=sum( ); 17 printf("%d\n",a); 18 }
2.#ifdef~#endif
其作用是: #ifdef 宏名 如果宏名已被#define 程序段1 行定义,则编译程序段1, #else 程序段2 否则编译程序段2。 #endif 其中需说明一下几点: (1)#else可以没有,但#endif必须存在,它是#if命令的结尾。 (2)在#ifdef和#else之间可以加多个#elif命令。 (3)“#ifdef宏名”的含义是判断是否定义了宏。 (4)每个命令独占一行。
1) elif是else if 的缩写,但不可写成else if。 2) #elif和#else可以没有,但#endif 必须存在,是#if 命令的结尾。 3) #elif命令可以有多个。 4) if后面的条件必须是一个常量表达式,通常会用到 宏名,条件可以不加括号“()”。 5) 每个命令独占一行。
void main() { 程序实例如下 float price1,price2,sumprice; 源程序 scanf("%f%f",&price1,&price 2); #define USA 0 sumprice=price1+price2; #define ENGLAND 1 printf("sum=%.2f%s",sumpri #define FRANCE 2 #define ACTIVE_COUNTRY ce,currency); } USA #if ACTIVE_COUNTRY==USA char *currency="dollar"; //有效 #elif ACTIVE_COUNTRY==ENG LAND char *currency="pound"; #else char *currency="france"; #endif
(7)宏定义一般以换行结束,不要用分号结束,以 免引起不必要的错误。例如 #define PI 3.14159; 则a=PI*2*2;经替换后变成 了a=3.14159;*2*2;一看就知道是错误的。 (8)宏定义被重复定义。例如: #define N 10 //第一次宏定义 N的内容是10 int f() { return (N*N); } #define N 20 //第二次宏定义 N的内容是20 void main() { printf("%d\n",N+f()); }
二、宏定义
宏定义分为两种:不带参数的宏定义和带参数的 宏定义。 1.不带参数的宏定义 #define指令定义一个标识符来代表一个字符串, 在源程序中出现该标识符时,都用该字符串替换, 以形成新的源程序。 一般格式为:#define 标识符 字符串
宏定义指令名称
宏名
宏体
例7-14
#define PI 3.1415 void main() { double r,s; scanf("%lf",&r); s=PI*r*r; printf("s=%f\n",s); }