------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、全局变量和局部变量
根据变量的作用域,可以分为:局部变量、全局变量
1.局部变量:
1> 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2> 作用域:从定义变量的那一行开始,一直到代码块结束
3> 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4> 没有固定的初始值
2.全局变量
1> 定义:在函数外面定义的变量
2> 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
4> 默认的初始值就是0
3.全局变量和局部变量可以重名
static和extern关键字对函数的作用
1.内部函数与外部函数
外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件。
extern声明、定义外部函数
默认情况下是extern。
static声明、定义内部函数
有时候,我们可能想定义一个"内部函数”,也就是不想让其他文件访问本文件中定义的函数。
这时就可以用static定义一个内部函数,这个函数可以和其他文件的中的函数重名
一、预处理指令简介
1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译
2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号
3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件
4.C语言提供的预处理指令主要有:宏定义、文件包含、条件编译
预处理指令——宏定义
1.不带参数的宏定义
1)一般形式
#define 宏名字符串
比如#define ABC10
右边的字符串也可以省略,比如#define ABC
2)作用
它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
例子:根据半径计算圆的周长
3)使用习惯与注意
1>宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误。
2>对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。
3>在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查。
4)宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
2.带参数的宏定义
1)一般形式
#define 宏名(参数列表)字符串
2)作用
在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数用宏名右边参数列表中的参数替换
3.使用注意
1)宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串
2)带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数,以免导致计算结果不是我们想要的结果。
如果定义宏的时候不用小括号括住参数:
预处理指令——条件编译
在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
基本使用;
1>如果条件1成立,那么编译器就会把#if与 #elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)
2>如果条件1不成立、条件2成立,那么编译器就会把#elif与 #else之间的code2代码编译进去
3>如果条件1、2都不成立,那么编译器就会把#else与 #endif之间的code3编译进去
4>注意,条件编译结束后,要在最后面加一个#endif,不然后果很严重(自己思考一下后果)
5> #if和 #elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时才产生的、才有使用的意义
预处理指令——文件包含
1.基本概念
其实我们早就有接触文件包含这个指令了,就是#include,它可以将一个文件的全部内容拷贝另一个文件中。
2.一般形式
直接到C语言库函数头文件所在的目录中寻找文件
系统会先在源程序当前目录下寻找,若找不到,再到操作系统的path路径中查找,最后才到C语言库函数头文件所在目录中查找
总结:
1.带参数的宏比函数具有更高的执行效率。
2.宏定义仅仅是文字替换,为了避免计算结果不正确,宏的参数要加上括号。
3.条件编译要记住写 #endif ,不然后果很严重。
4.可以嵌套包含(b.h包含a.h,c.h包含b.h),但是不能递归包含(a.h包含b.h,b.h包含a.h)。