---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
C语言一些常见的注意6(尾)
1、(预处理) 预处理是在程序编译成机器指令之前执行,且所有的预处理都是以#开头。预处理指令有3种:
1、宏定义 2、条件编译 3、文件包含
2、预处理指令是有作用域的,概念跟变量一致。
3、宏定义分为带参数的和不带参数的,宏定义的实质就是文本替换。如:
#define COUNT 4 // 宏定义个常量,在程序中可以用COUNT来代替4,注这里的变量名要大写,这是
一种规范,结束宏定义的变量#undef。
#define sum(a, b) (a+b) // 宏定义一个加法运算,注意右边的要替换的内容要加个括号,这样在替换的时
候才不会出错
#define square(a) (a)*(a) // 应该在对于每一个参数都加一个括号,这样在替换的时候才不会出错
… … // 省略一些代码
int c =sum(2,4)*sum(2,4); // 若不加外层括号,最终替换为2+4*2+4=14,但是你实际想要的是(2+4)*(2+4)=36,
所以要加上外层括号
int d= square(2+4); // 不对变量加括号的替换结果是:2+4*2+4=14,所以对参数加上括号才不会出错
#undef COUNT // 之后再用COUNT会出错,注意这行结尾没有分号
采用预编译效率高
4、(条件编译)选择是否编译那段代码,不符合的代码不会参加编译,也就不会占用内存,语法与if相
似:#if …#elif… #else …#endif(这句一定要写)
5、(文件包含)重复包含同一个文件会降低编译效率,所以避免重复加载,采用条件编译,假如一个jiafa的头文件,
它的避免重复加载的预编译形式如:
#ifndef JIAFA_H //假如没有这个宏定义,注意这里宏变量的名称的书写
#define JIAFA_H //就定义这个宏定义
…
#endif // 一定要有这句
6、(typedef)可以给类型取一个别名,如:typedefint myInt; // 注意这里又分号
一般将int取代成其他类型就可以给其他类型取别名,当中包括基本数据类型、枚举、结构体。
但对于指像函数的指针的定义有点不一样:
int (*p) (int, int); // 现有指向左边的形式的函数指针
它的typedef是:typedefint (*新名称) (int, int);
7、宏定义也可以为类型取一个别名,但注意它的实质是文本替换,所以有些时候不适用,像:
#define Stringchar * // 宏定义char *为String类型
String s1,s2; // 这里的s2不是我们想要的char*类型,只是char类型
8、外部函数:能被本文件及其他文件使用的函数称为外部函数,默认情况下所有的函数都是外部函数。extern的声
明和定义一个外部函数,一般可以省略。
内部函数:只能被当前文件使用的函数称为内部函数。用static来声明和定义一个内部函数
9、全局变量分两种:
外部变量:定义的变量能本文件和其他文件访问,默认情况下全局变量都是外部变量,关键子extern用来声明变量。
而且不同文件的同名变量代表同个变量。
内部变量:只能在本文件使用,关键字static用来定义一个变量。不允许与外部变量重名。
10、 static与局部变量:
static修饰局部变量会延长它的生存周期(即在内存存放的static变量只会在程序结束时候释放,且只会分配一次),
但是它的作用域不会改变。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------