C语言——宏定义、条件编译、文件包含等

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、预处理指令
1、所有的预处理指令都是以#开头
2、预处理指令分为三种
1)、宏定义
2)、条件编译
3)、文件包含
3、预处理指令在代码翻译成0和1之前,替换成值
4、预处理为止是随便写的
5、预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾
6、宏名一般用大写或者以k开头,变量名一般用小写

#include<stdio.h> 
#define COUNT 5 //#define 宏名 值

int main ()
{
	char *name="COUNT";//出现在双引号中的COUNT不会换成5 
	
	
	int ages[COUNT]={1,2,67,89,90};
	for(int i =0;i<COUNT;i++){	
	printf("%d\n",ages[i])	;
	}
	#undf COUNT//从这行开始,COUNT这个宏失效 
	int a =COUNT; 
	

	return 0;
} 

/*
1.带参数的宏定义效率比函数高 
*/
/*
int sum(int a,int b)
{
	return a+b
}
*/
#include<stdio.h>
#define sum(v1,v2) ((v1)+(v2))
#define pingfang(a)  ((a)*(a))
//宏定义纯粹的是文本替换 
int main ()
{
	//pingfang(5+5)  (35)
	//pingfang(5+5)/pingfang(2)   
	int c =pingfang(10)/pingfang(2);
	printf("c is %d\n",c);	
/*
int c = sum(2,3) * sum (6,4);
printf("c is %d\n",c);
*/
/*	int a=10;
	int b=20;
	int c=sum(a,b);
	printf("c is %d\n",c);
	//int c = sum (a,b) ;
*/		
	return 0;
}

二、条件编译
在很多情况下,我们希望程序的其中一部分代码只有在满族一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译.
基本用法

#if 条件1
...Code 1...
#elif 条件2
...Code2...
#else
...Code3...
#endif
1>.如果条件1成立,那么编译器就会把#if与#elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)
2>.如果条件1不成立,条件2成立,那么编译器就会把#elif与#else之间的code2代码编译进去
3>.如果条件1.2都不成立,那么编译器就会把#else与#endif之间的code3编译进去
4>.注意,条件编译结束后,要么最后面加一个#endif,不然偶过很严重
5>.#if与#elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时产生的.才有使用的意义

#if #defined()和#if !Defined()的用法
#if 和 #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏。比如:

1 #if defined(MAX)
2     ...code...
3 #endif
如果前面已经定义过MAX这个宏,就将code编译进去。它不会管MAX的值是多少,只要定义过MAX,条件就成立。

条件也可以取反:

1 #if !defined(MAX)
2     ...code...
3 #endif
如果前面没有定义过MAX这个宏,就将code编译进去。

 

2.#ifdef和#ifndef的使用
* #ifdef的使用和#if defined()的用法基本一致

1 #ifdef MAX
2     ...code...
3 #endif
如果前面已经定义过MAX这个宏,就将code编译进去。

* #ifndef又和#if !defined()的用法基本一致

1 #ifndef MAX
2     ...code...
3 #endif
如果前面没有定义过MAX这个宏,就将code编译进去。

文件包含指令
/*
1.<>表示系统自带的文件,""表示自定义的文件
2.不允许循环包含,比如a.h包含b.h,b.h又包含a.h
*/
#define LISI_H
Int sum (int a ,int b);

#ifndef  WANGWU_H
#deffine  WANGWU_H
Int minus(int a,int b);
#endif

#include<stdio.h>

Int main ()
{
Int c = sum(10,19);
Printf(“c is %d\n”, c);
Return 0;
}

Typedef定义类型的关键字
/*
1.给已经存在的类型起一个新的名称
2.使用场合: 
1>.基本数据类型
2>.指针
3>结构体
4>.枚举
5>.指向函数的指针 

*/
#include<stdio.h> 
typedef int MyInt;
typedef MyInt  MyInt2;
//给指针类型char*起了一个新类型名称string
typedef char* String;
int main ()
{
	String name = "jack";
	printf("%s\n",name);

	return 0;
} 

void test()
{
	int a;
	MyInt i = 10;
	MyInt2 c = 20;
	MyInt b1,b2;
	printf("")
}

/*
外部函数:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数
1>.默认情况下所有函数都是外部函数
2>.不允许有同名的外部函数 
内部函数:定义的函数只能被本文件访问,其他文件不能访问
1>.允许不同文件中有同名的内部函数 
static对函数的作用:
1>. 定义一个内部函数 
2>. 声明内部函数 
extern对函数的作用:
1>.完整的定义一个外部函数
2>.完整的声明一个外部函数
(extern可以省略,默认情况下声明和定义的函数都是外部函数) 
*/
#include<stdio.h>
//声明一个内部函数
static void test2(); 
//完整地定义一个外部函数
/*
extern void test()
{
	printf("调用了test函数\n");
} 
*/
//默认情况下,所有函数都是外部函数,所以可以省略extern 
extern void test()
{
	printf("调用了test函数\n");
} 
//定义一个内部函数
static void test2()
{
	printf("调用了test2函数\n");
	test2();
} 


//声明一个test函数
//完整地声明一个外部函数
//extern可以省略 
//extern void test(); 
void test(); 

void test2();
int main ()
{
	test(); 
	test2();
	return 0; 
} 
/*
全局变量共分两种: 
外部变量: 定义的变量能被本文件和其他文件访问 
1>.默认情况下,所有的全局变量都是外部变量 
2>.不同文件中的同名外部变量, 都代表着统一变量 
内部变量:定义的变量只能被本件访问,不能被其他文件访问 
1>.不同文件中同名内部变量,互不影响 
static 对变量的作用:
 定义一个内部变量
 extern对变量的作用:
 声明一个外部变量
 static对函数的作用:
 声明和定义一个内部函数
 extern对函数的作用:
 用来定义和声明一个外部函数(可以省略) 
*/
#include<stdio.h>
void test();
//定义一个外部变量 
int a;

//定义一个内部变量
static int b; 
//声明一个外部变量
//extern int a; 
int main()
{
	b = 10;
	test();
	printf("b的值是%d\n",b);
/*	a = 10;
	test();
	printf("a的值是%d\n",a);
	*/
	return 0;
} 




#include<stdio.h>
//int a;
void test()
{
	printf("a的值是%d\n",a);
}

static与局部变量
#include<stdio.h> 
/*
static修饰局部变量的使用场合:
1.如果某个函数的调用频率特别高
2.这个函数内部的某个变量值是固定不变的 

*/


void test()
{
	static double pi =3.14;
	double zc =2 * pi * 10;
	int a = 0;
	a++;
	printf("a的值是%d\n",a);//1
	/*
	static修饰局部变量:
	1>.延长局部变量的声明周期:程序结束的时候,局部变量才会被销毁
	2>.并没有改变局部变量的作用域 	
	3>.所有的test函数都共享着一个变量b 
	*/ 
	static int b = 0;
	b++;
	printf("b的值是%d\n",b);//1 
}
int main()
{
	test();
	test();
	test();
	return 0;
}







/*
设计一个函数,用来计算b的n次方 
*/
/*递归的2个条件
1.函数自己调用自己
2.必须有个明确的返回值 
*/ 
#include<stdio.h>
int pow2(int b,int n);

int main()
{
	int c = pow2(2,10);
	printf("%d\n", c);
	return 0;
}

/*
pow2(b, 0) == 1
pow2(b, 1) == b ==pow2(b, 0) * b
pow2(b, 2) == b*b == pow2(b, 1) * b
pow2(b, 3) == b*b*b == pow2(b, 2) * b

	1>.n为0,结果肯定是1
	2>.n>0,pow2(b, n) == pow2(b, n-1) * b
*/

int pow2(int b,int n)
{
	if (n <= 0) return 1;
	return pow2(b, n-1) * b;
}

int pow2(int b,int n)
{
	//用来保存计算结果
	int result = 1;
 	/*
	result *= b;
	result *= b;
	result *= b;
	result *= b;
	result *= b;
	...
	n次 
	*/ 
	for (int i = 0; i < n; i++) 
	{
		result *= b;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值