C语言预处理指令与全局局部变量


一、C语言预处理指令

    预处理指令包含三种分别是宏定义,条件编译,文件包含。(最后都没有分号)

预处理指令在代码翻译成1,0之前执行!预处理位置可以随便写。
但是他的作用域,从编写指令那行开始,一直到文件结尾。

1、宏定义分为两种(宏的效率比函数高)

掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”

       1>    不带参数的宏定义(名字一般大写):

#define COUNT 4   

       2>    带参数的宏定义:

如:

 #define   sum( v1 , v2 )   v1 + v2;   //调用的时候等于将左边的替换成右边的 

                调用的时候如果写成 sum( 2, 3 )* sum( 6, 4 ), 

                 那么编译器会替换成        2+3  *   6+ 4   这样就违背了我们的原意。

                 所以我们再定义带参数的宏定义的时候,一般每个值都要加上一个括号,

                如:#define pingfang(a)  ((a)*(a))

2、条件编译

有些语句希望在条件满足时才编译。
格式:
#ifdef  标识符
#else
#endif

    如:

#if (a == 10)
     printf("a==10");
  #elif(a == 5)
     printf("a==5");
  #else
     printf("a==其他");
  #endif

注意事项:

       1>    因为条件编译时预编译,所以,一定要在他编译之前对A进行赋值,#define A 5

       2>    一定要写#endif

       3>    条件编译的几种用法:

(1)使用的时候有两种选择:#if  defined (A) 

                                                            # endif

                                            或者        #ifdf  A

    # endif

(2)   #if   defined(A )   //  如果定义过A这个宏,就执行下面的代码,也可以写成#ifdf  A(这样写不加加括号)

printf("A已定义过");    

       # endif 

(3)  #if !defined(A)              //同样可以写成 # ifndf A 

printf("A没有定义过");  

       # endif 


3、文件包含

一个文件包含另一个文件的内容
格式:
# include "文件名"
#include < 文件名>

文件包含的时候,可能会因为遗忘等多次写入,浪费内存,所以为了确保文件只能被包含一次,我们可以在头文件中这样定义:

# ifndef ABC
#define ABC
 int sum(int a, int b);
#endif    //这样写进头文件,每次包含的时候,会判定是否已定义过ABC,如果已经定义过,那下面的就不会执行。


                 

二、typedef

1、基本用法
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:

typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;


       typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。


2、typedef 与#define 区别


1> #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.

2>typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名.

3>还有typedef结尾需要加分号,但是#define 则不需要。

4>例子:
 

 #define String2 char*//右边替换左边
    typedef char * String;

String   s1,s2;//这两个变量都是指针类型;
  String2  s3,s4;//这里面相当于 char *s3,s4;//s4被定义成了char类型变量。 



三、全局变量与局部变量

1、全局变量:定义在函数外面的变量,而且默认初始值就是0;

全局变量分为两种        

(1)外部变量,默认所以文件的全局变量都是外部变量。而且不同文件的同名外部变量都代表着同一个变量。

(1)内部变量,只能被本文就访问, static int b;//定义一个内部变量。 只能当前文件使用。

   【内部函数,外部函数同样如此】默认所有函数都是外部函数,所以可以省略extern。而内部函数,别的文件不能调用。

          static对函数作用:1,定义一个内部函数,2声明一个内部函数。
          extern对函数作用:1,完整的定义一个外部函数,2声明一个外部函数,但是可以省略。


2、局部变量:定义在函数内部,包括函数的形参,没有固定的初始值。



static对变量的作用:定义一个内部变量
extern对变量的作用:声明一个外部变量


3、static 和 extern

在C语言中,不同的代码以.c为界限分割开来,再单个.c文件中,有着不同的函数,main通过传递参数调用参数,来掌控整个程序有序运行,期间某个函数不想单纯听从main的指挥调度,于是树立了自己的政权static,static不用听从main的调度,自己做主,main也无奈,因为相对于static来说,extern更是让main难以掌控全局,因为不同的.c文件可以通过extern相互调用。

static要注意以下几点:

        (1)static在main运行之前,就已经被分配,而且是在程序彻底退出之后才被释放。

        (2)static变量有访问权限,在子函数里声明的static变量,只能在该函数内访问,如果static在函数体外声明,那他的访问权限就是本文件内。

        (3)static不仅可以修辞变量,还可以修辞函数,如果来修辞函数,表示本函数访问权限在本源文件内。

 extern:

extern是指当前变量或函数不是在本源文件内声明的,是外部变量或外部函数,“外来的和尚会念经”,能很好的体现extern的价值,当我们在本文件内试图使用一个外部声明的全局变量或函数时,可以在其前面加上extern,表示他是外来和尚。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值