C预处理、static和extern

来源:互联网 发布:sql sequence 编辑:程序博客网 时间:2024/05/22 06:05

1、预处理指令:

定义:1>预处理指令是在程序开始编译前执行。

          2>全部是#开头。

分类: 宏定义、条件编译、文件包含

作用域:从编写指令开始,一直到文件结尾。


2、宏定义(替换代码)

关键词:#define 宏名值    (宏定义只负责换代码,并不负责运算   值中每个参数要加())

  #define count 4   // 会将程序中所有count 转化成4  如果代码中是“count” 则此count不会被替换

  #undef  取消define宏的作用。

  注:宏名使用大写,变量名用小写。

★带参数的宏定义

一般形式:

#define 宏名(参数列表) 字符串

使用注意:

1> 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符

2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数

3> 计算结果最好也用括号括起来

与函数的区别

1> 宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题

2> 函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率


3、条件编译(文件编译时存在)

#if()A    // 如果只编译了A,则下面的B和C不会保存在内存中 #elif()B#else()C#endif  


  : 1>条件编译只编译宏中定义的语句,且如果elif或else没有判断,则此没有保存在内存中(不参与编译的不会保存在内存中)。

2>endif必须添加

  #if defined() 相当于 #ifdef

  #if undefined 相当于#ifndef


4、文件包含

    注:不允许循环包含(互相包含)。

      防止多次包含方法:

        #ifndef  ...#define  ...         .....#endif#idndef _TEST  // 如果没有定义_TEST,则会运行以下,就是声明test( )函数,如果定义了,就不会进行声明,防止了文件重复包含#define _TESTtest();#endif 


5、类型定义 typedef 

    #typedef int myint;    // 将int类型的别名定义为myint

    使用场合:

 1>基本数据类型

   typedef int myint;

 2>指针

 typedef  char *  p;  // p是名字

 3>结构体

typedef struct student{                int age;} stu;   //类型名是stu

    定义结构体的指针:

typedef struct student  * p;   // p是名字

4>枚举 

         定义枚举的2种方式,如下:

/*enum Sex {Man, Women};typedef enum Sex MySex;*/typedef enum Sex {    Man,    Woman} MySex;int main(){    MySex s = Man;    // enum Sex s = Man;    ......}

5>指向函数的指针

typedef int (*name)(int , int)     // name是以后的名字


6、static和extern

    1>对函数的影响

  外部函数:定义的函数能被本文件和其他文件访问。(函数默认为外部函数)(其它文件可访问)

  注:外部函数不能有重名

  内部函数:定义的函数只能被本文件访问,其他文件不能访问。(只有本文件访问)

  注:内部函数可以不同文件中函数重名

  extern:声明或定义此函数是外部函数。

  extern void test();

  static:声明或定义此函数是内部函数。

    2>对变量的影响

      全局变量分类:

    外部变量:定义的变量能被本文件和其他文件访问。(其它文件可访问)

    注:不同文件中的同名外部变量,都代表着同一个变量。

    内部变量:定义的变量只能被本文件访问(只有本文件访问)

    3>static对局部变量影响

(1)延长局部变量生命周期,局部变量就不会随着函数调用结束就被销毁,而是等到程序结束后才被销毁。

(内存空间中一直有此变量)    

(2)没有改变局部变量的作用域。

 使用范围:

(1)某些变量值保持不变。

(2)某些变量值使用频繁

0 0