1、宏定义
一、不带参数的宏
/**宏命令 预处理指令*/
//1、不带参数的宏
#define COUNT 4
char chars[COUNT]={'a','b','c','d'};
for (int var = 0; var < COUNT; var++) {
printf("%c",chars[var]);
}
printf("\n");
#undef COUNT;//结束宏定义
// printf("count:%d",COUNT);//不能识别
二、带参数的宏
//2、带参数的宏
#define sum(a,b) ((a)+(b))
#define ji(x) ((x)*(x))//注意加上小括号,否则对于复杂的四则运算容易出错
int result= sum(1,ji(5));
printf("result:%d\n",result);
2、条件编译
//条件编译
#define COUNT 9
#ifdef COUNT
printf("定义了count!\n");
#else
printf("没有定义了count!\n");
#endif
#undef COUNT
#ifndef COUNT
printf("没有定义了count!\n");
#endif
/**
* 定义了count!
没有定义了count!
* */
//文件包含 防止重复编译头文件
//例如:test.h 系统会自带文件宏定义和条件编译 防止重复包含,重复编译
#ifndef TEST_H
#define TEST_H //定义一个空文件
#endif
3、typedef
一、数据类型
//typedef
typedef int Myint;//基本数据类型
Myint a=12;
typedef char * String;//char 数组
String name="lili";
//结构体
/**
struct Person
{
int age;
String name;
};
typedef struct person Myperson;*/
//可以精简为下面这种写法
typedef struct Person
{
int age;
String name;
} Myperson;
Myperson mp={22,"lilei"};
//结构体方式二 有上面的观察可以发现 Person完全没有必要写,下面这种更精简的方式
typedef struct
{
int age;
int code;
String name;
} MyStudent;
MyStudent ms={27,100,"wei"};
//结构体指针
//正常的写法
/**struct Person2
{
int age;
String name;
};
struct Person2 * pp;*/
//typedef写法
typedef struct Person2
{
int age;
String name;
} * personPoint;
struct Person2 p2={20,"zhizhen"};
personPoint pp=&p2;
//枚举
enum Sex{man,woman};
typedef enum Sex MySex;
typedef enum Season
{
Spring,
summr,
autuom,
winter
} MySeason;
MySex msex=man;
MySeason msn=winter;
printf("myint :%d\n",a);
printf("String:%s\n",name);
printf("myperson:name:%s\tage:%d\n",mp.name,mp.age);
printf("mystudent:name:%s\tage:%d\tcode:%d\n",ms.name,ms.age,ms.code);
printf("personPoint:name:%s\tage:%d\n",(*pp).name,(*pp).age);
//结果:
// myint :12
// String:lili
// myperson:name:lilei age:22
// mystudent:name:wei age:27 code:100
// personPoint:name:zhizhen age:20
二、函数
//函数
int (*Mycount)(int,int);
Mycount=∑
printf("%d\n",Mycount(10,18));
Mycount=−
printf("%d\n",Mycount(10,18));
//typedef 写法
typedef int (*NewMycount)(int,int);
NewMycount nsum=sum;
NewMycount nminus=minus;
printf("%d\n",nsum(10,18));
printf("%d\n",nminus(10,18));
// 28
// -8
// 28
// -8
4、typedef 注意事项
//typedef注意事项
typedef char * String;
#define String2 char *
String s1,s2;//s1,s2都为char * 类型
s1="jim";
s2="lili";
String2 s3,s4;
s3="leifeng";
// s4="lilei";这句报错了 为啥呢?
// 提示:char 类型不能转换为 char *,不对啊?s4 不应该是char * 类型么? 这是 因为宏定义 是这样替换的
/***
* String2 s3,s4 ----> char * s3,s4; 仅只有s3是char *类型
*
*
* /