C语言 枚举类型和预处理指令

2019-06-25  本文已影响0人  一直很安静_25ae

枚举的定义

enum Season
    {
        spring ,
        summer,
        autumn,
        winter
    };
    
    // 2.定义枚举变量
    enum Season s = spring;

预处理指令

  1. 所有的预处理指令都是以#开头
  2. 预处理指令分为三种
  1. 预处理指令在代码翻译成0根1之前执行
  2. 预处理的位置是随便写的
  3. 预处理的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
  4. 宏定义一般用大写或K开头,变量名一般用小写

宏定义

   #define COUNT 4   
    int ages[COUNT] = {1, 2, 67, 89};
    for ( int i = 0; i<COUNT; i++) {
        printf("%d\n", ages[i]);
    }
//函数求和
int sum(int a, int b)
{
    return a + b;
}
int main()
{
   int a = 10;  
   int b = 20;
int c = sum(a, b);
}
//宏定义求和
#define sum(v1, v2) ((v1)+(v2))
int main()
{
   int a = 10;  
   int b = 20;
int c = sum(a, b);
}

注意带参数的宏定义中每一个参数都需要加括号();

#define pingfang(a) ((a)*(a))
int main()
{
int c = pingfang(5+5);//(5+5)*(5+5) =100
}

条件编译

条件编译跟if else差不多

//if-else语句
int main()
{
int a = 10;
 if (a == 10)
    {
        printf("a是10\n");
    }
    else if (a == 5)
    {
        printf("a是5\n");
    }
    else
    {
        printf("a其他值\n");
    }

}
//条件编译
// 只要写了#if,在最后面必须加上#endif
#define A 5
int main()
{
#if (A == 10) //因为是预处理指令,所以此处的A也需要提前编译的,所以A需要写成宏
    printf("a是10\n");
#elif (A == 5)
    printf("a是5\n");
#else
    printf("a其他值\n");
#endif
}
//条件编译的其他用法
#define A 5

//第一种
#if defined(A) //注意括号里面的A是一个预处理的宏
    printf("哈哈\n");
#endif
//第二种
#if !defined(A) //注意括号里面的A是一个预处理的宏,defined前面的!表示取反
    printf("哈哈\n");
#endif
//第三种,取代上面的两种方法
#ifdef A
    printf("哈哈\n");
#endif

#ifndef A
    printf("哈哈\n");
#endif

include

//李四的.c工程
int sum(int a, int b)
{
    return a + b;
}
//李四的.h文件
#ifndef LISI_H  //自定义的宏一般为文件名的大写 ,这三行的作用主要是为了防止被重复引用
#define LISI_H
int sum(int a, int b);
#endif
//张三想用李四的函数,张三的.c文件
/*
 1.<>表示系统自带的文件,""表示自定义的文件
 2.不允许循环包含,比如a.h包含b.h,b.h又包含a.h
 */
#include "lisi.h"
#include <stdio.h>
int main()
{
    int c = sum(10, 19);
    
    printf("c is %d\n", c);
    
    return 0;
}

typedef

  1. 作用:给已经存在的类型起一个新的名称
  2. 使用场合:

1> 基本数据类型
2> 指针
3> 结构体
4> 枚举
5> 指向函数的指针

typedef int MyInt;
int main()
{
    MyInt i = 10;
}
typedef int MyInt;
typedef MyInt MyInt2; //可以为重命名的类型继续重命名
int main()
{
    MyInt i = 10;
    MyInt2 c = 20;
}
// 给指针类型char *起一个新的类型名称String
typedef char * String;
int main()
{
   String name = "jack";
}
//第一种
struct Student
{
    int age;
};
typedef struct Student MyStu; 

int main()
{
   MyStu  stu =  {10};
}
//第二种
typedef  struct Student
{
    int age;
} MyStu;

int main()
{
   MyStu  stu =  {10};
}
//第三种方式,直接省掉名字
typedef struct
{
    int age;
} MyStu;

int main()
{
   MyStu  stu =  {10};
}

//第一种
enum Sex
 {
  Man,
 Woman
};
typedef enum Sex MySex;
int main()
{
  MySex s = Man;
}
//第二种
typedef enum {
    Man,
    Woman
} MySex;

int main()
{
  MySex s = Man;
}

typedef int (*MyPoint)(int, int);
int sum(int a, int b)
{
    return a + b;
}

int main()
{
  MyPoint p = sum;
}

define和typedef的区别

#define Integer int //没有;分号 把后面的数据类型定义成前面这种方式

typedef int Integer; //后面有分号,把前面这种数据类型重新命名成后面的数据类型
上一篇 下一篇

猜你喜欢

热点阅读