黑马程序员——C语言—预处理指令和static的作用


C语言第四篇---预处理指令和static的作用

 

 

         这是一个小插曲,原本这篇是OC第一篇的,但是C中还是提一下预处理这个概念,总结一下。
   

 1.预处理指令:


        预处理指令是在编译器翻译成0和1之前让C语言读取的一种指令,指令分为:宏、条
件编译

文件包含,三种指令,先说一说宏:宏分为不带参数的宏,和带参数的宏,宏定义就是替换C语

言中的文本,比如将C语言中的文本 TRUE 替换成1,之所以用到宏可以节省编译的时间,如果

在一个程序中经常用到某个数值或某个文本就可以用宏去代替。例如:

    #define COUNT 6;             //不带参数的宏

    int main()
{
   int a[COUNT];

   return 0;
}

       这里宏将数组中COUNT充当元素个数替换成6。那么说到定义,宏可以在任何位置定义,

是前提是一定在用到宏之前定义,并且它的作用域是从定义开始到文件结尾。

        还有一种带参数的宏,带参数的宏可以充当计算的作用,宏不是用来替换文本的吗,怎么可

以运算呢,看一下代码就知道了:


       这里将cheng(3,5)直接替换成 (3)*(5) 这样间接的实现了运算,切忌在宏定义时,

#define cheng(n1,n2) ((n1)*(n2))  后面要替换成的每一个数值都加上括号,否则后果不堪设想,例如:

      int result=cheng(3,5);换成 int result=cheng(3+3,5+5);  如果不加括号它会这样替换:

int result=(3+3*5+5);结果就不是正确的了,因为宏知识单纯的替换文本而已,相比运算来讲宏

要节省内存,宏在编译前进行的文本替换,替换成了常量,因此不分配内存,如果不用宏,在代码

中需要定义变量分配内存。因此合理使用宏会更胜一筹。


      条件编译就可以猜出来,选择性的编译,条件成立就编译,不成立就不编译。它的格式是:

   #if 条件 ..... 

  #elif 条件.... 

  #endif

       通常的来说条件编译的条件就是宏,在没有编译之前是没有任何变量的,这时宏可以充当条件

变量,由此这样一来程序的效率会很高,不成立的不参与编译,节省了编译的时间。但是需要注意

的是#endif必须要加,这时条件编译的结束标志,如果没有那么后面不管写多少代码都是不参与编

译的,后果是很严重的。


       文件包含就是头文件,包含头文件就是对代码中函数的申明,一般情况下系统的头文件用<>括

起来,自己定义的头文件用""引起来。在函数申明时难免会不只一遍的包含头文件,为了发生这种情

况,在自己定义的头文件中加入这段代码即可:

    #ifndef A  

   #define A
    ...
    #endif


2.typedef类型:

 

      typedef是给类型起个别名,比如给char起个Chr,以后再定义char类型变量时就可以直接用别

名 Chr 去定义了,typedef作用很实用,有时候我们不喜欢写一大堆定义类型的语句,比如结构体,

枚举,结构体指针,函数指针。这些在定义和使用时都很麻烦,这时就可以给它们起个别名,简化

代码量,减少工作量。例如:

  
    typedef struct student
{
  int age;

  char name[10];
}myStu;

      这就给定义的结构体类型起了个别名叫myStu,定义结构体变量就可以这样定义了:
 
     myStu stu1={21,"minglei"};   相比以前定义结构体变量要简单多了。似乎宏也可以完成,例如:

 #define myStu struct student
{
  int age; 

  char name[10];
};


       这样也可以完成,只不过刚好反了过来。把myStu的地方全部替换成结构体,但是需要注意的

是如果是指针就不行了,例如:

   #define String char *


ine main()
{
    String a,b,c;
}

       这里就有问题了,正常的思路是a,b,c都是字符指针,但是宏只是文本替换,替换是这样

的:char *a,b,c; 这里只有a是字符指针,b和c都是字符,因此宏不可以完全和typedef互换。

 

3.static修饰符:

 

       static和extern是两个相对应的,static是定义和申明一个内部变量或函数,而extern是定义和

申明一个外部变量或函数,所谓的内部函数和变量是:只可以被本文件中的函数和变量所访问。

外部函数和变量是:可以被本文件或外部文件访问的函数和变量。extern是可以省略的,因此只要

没有static修饰的函数或变量都是外部函数或变量。static修饰局部变量还有一个用途,假如说我们

调用一个外部函数,这个外部函数调用完后会被销毁,但是我们不希望它的一个变量不销毁就可以

使用static去修饰它,static修饰局部函数,可以使它的生命周期延长。


       总结:预处理命令、typedef、static都是很常用的,对我们编程有很大的帮助也是不可缺少的一

部分,有了它们的帮助使程序变得更精简,更高效,减少代码重复量。好了,向OC前进!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值