您的位置:首页 > 编程语言 > C语言/C++

黑马程序员 C语言 - 09 预处理指令、typedef、extern、static

2014-08-29 19:57 555 查看
若排版有错误,请查看PDF:C语言 - 09 预处理指令、typedef、extern、static.pdf

第十八章 预处理指令

1.       所有的预处理指令都是以#开头

2.       预处理指令分3种

1)     宏定义

2)     条件编译(满足条件才进行编译)

3)     文件包含

3.       预处理指令在代码翻译成0、1(编译)之前执行

4.       预处理指令的位置是随便写的

5.       预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用

 

一、  宏定义

1.       宏定义只是文本替换

2.       宏名一般用大写或者以k开头,变量名一般用小写

3.       作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用

 

    #define kCount 6
    #define sum(v1,v2) ((v1)+(v2))
// 带参数的宏定义效率比函数高,每个参数都要加()
    #define pingfang(a) ((a)*(a))
 
    int main()
    {
        int ages[kCount] = {1,2,
3, 4,
5, 6};// kCount替换成6
       
    #undef kCount //从这行开始宏失效
   
       int c = sum(2,3) * sum(6,4);
 
       int d = pingfang(5+5)/pingfang(2);
 

二、  条件编译

条件编译(满足条件才编译):#if最后一定要写#endif

 

    #define A 10
    int main()
    {
    #if (A == 10)
        printf("a是10\n");//
条件满足,只编译这一句
    #elif (A == 5)
        printf("a是5\n");
    #else
        printf("a其他值\n");
    #endif
       
    #ifdef A //如果定义A宏,那么编译printf
    #ifndef A //如果没有定义A宏,那么编译printf
        printf();
 }

 

三、  文件包含

1.       <>表示系统自带的文件,""表示自定义的文件

2.       不允许循环包含,比如a.h包含b.h,b.h又包含a.h

3.       在Lisi.h文件开头加入:

#ifndef LISI_H

#define LISI_H

可防止重复编译

 

int sum(int a,int b);

#endif

 

第十九章 typedef(类型定义)

一、  作用:给已经存在的类型起一个新的名字

二、  使用场合:

1.     基本数据类型

typedef int MyInt;

2.     指针

typedef char * String;//
给指针类型char*起一个新的类型名称String

3.     结构体

1)     结构体

typedef
struct
{
  int age;
} MyStu;

/*
struct Student
{
    int age;
};
typedef struct Student MyStu;
*/

 

2)     指向结构体的指针

typedef
struct Person
{
  int age;
} * PersonPoint;
/*
struct Person
{
  int age;
};
typedef struct Person * PersonPoint;
*/

 

4.     枚举

    typedef
enum {
      Man,
      Woman
 } MySex;

    /*
    enum Sex {Man,Woman};
    typedef enum SexMySex;
 */

 

5.     指向函数的指针

typedef int (*MyPoint)(int,int);

 
    int main()
    {
      // 定义指针
       String name = "jack";
        
      // 定义结构体变量
      struct Person p = {20};
       
      // 定义指向结构体的指针
      PersonPoint p2 = &p; // struct Person *p2 =&p;
        
      // 定义枚举变量
      MySex s = Man;// enum Sex s = Man;
       
      // 定义指向函数的指针
      MyPoint p = sum;
      int (*p)(int,int) = sum;
      p(10,
11);
       
      return
0;
    }
 

第二十章 extern、static

一、  声明、定义的区别

声明可以重复,定义不能重复

 

二、  对函数的作用

1.     外部函数

1)     定义的函数能被本文件和其他文件访问(默认)

2)     不允许有重名的外部函数

2.     内部函数

1)     定义的函数只能被本文件访问

2)     允许有重名的内部函数

3.     extern

声明和定义一个外部函数

(extern可省略,默认情况下声明和定义的函数都是外部函数)

 

1)     完整地声明一个外部函数

extern void test();

 

2)     完整地定义一个外部函数

extern
void test()
{
}

 

4.     static

声明和定义一个内部函数

 

1)     声明一个内部函数

static void test2();

 

2)     定义一个内部函数

static
void test2()
{
}

 

三、  对变量的作用

1.     全局变量

默认初值是0

1)      外部变量

a)      定义的变量能被本文件和其他文件访问

b)     默认情况下,所有的全局变量都是外部变量

c)      不同文件中的同名外部变量,都代表着同一个变量

 

2)      内部变量

a)      定义的变量只能被本文件访问,不能被其他文件访问

b)     不同文件中的同名内部变量,互不影响

 

3)      extern

声明一个外部变量

extern int a;

 

4)      static

定义一个内部变量

static int b;

2.     局部变量

无固定的初值

1)      static修饰局部变量

a)      延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁

b)     并没有改变局部变量的作用域

c)      所有的test函数都共享着一个变量b

2)      适用场合

a)      如果某个函数的调用频率特别高

b)     这个函数内部的某个变量值是固定不变的

 

    void test()
    { // test函数掉用完后a的存储空间回收;b的值和存储空间保留,b的作用域不变
 
      int a =
0;
      a++;
      printf("a的值是%d\n", a);//
值总为:1        
   
      static
int b = 0;
// 第二次调用时,省略static这一行
      b++;
      printf("b的值是%d\n", b);//
第二次调用值为:2
    }
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐