黑马程序员 C语言一些常见的注意6(尾)

来源:互联网 发布:黑马餐饮软件 编辑:程序博客网 时间:2024/05/01 22:10

---------------------- <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>、期待与您交流! ----------------------


0 0
原创粉丝点击