本帖最后由 仰望星空的猪 于 2015-11-23 19:23 编辑
1 1 typedef使用 简单说就是给已存在的数据类型起别名。
形式
typedef 原类型名 新类型名;
1)typedef与基本数据类型
typedef int INT;
定义之后 INT就可以代替int 使用。
2)typedef与数组
typedef int ARRRY[5]; ARRRY arr; //等效于 int a[5];
3)typedef与结构体
struct Person{
int age ;
char *name[20];
};
typedef struct PersonP; P 的作用等效 struct Person
定义结构体的时候起别名。
typedef struct Car{
成员变量列表;
}CAR;
匿名结构体起别名
typedef struct {
成员变量列表;
}CAR;
3)typedef与枚举
类似结构体
typedef enum Color{ } COLOR;
4)typedef 与函数指针
int (*p)(int,int); typedef int (*F)(int,int);
F p; //等效于int (*p)(int,int)
2 预处理指令
在c语言中,以 # 开头的命令。 include define和条件编译。
1) 有参宏 #define 宏名 宏值(可以是常量、变量和表达式)
宏替换
编译之前把宏替换为宏值。完全替换不会添加或减少其他字符。
注意
宏名一般大写
宏定义不是语句,末尾无分号
宏定义必须写在函数之外,作用域从定义开始到程序末尾或者取消宏定义的地方。
#undef 宏名
2) 有参宏
#define 宏名(形参表) 字符串
#define SUM(a) a+a
#define SUM(x,y) x*y+x+y
#define SUM(x) x*y+x+y //使用时需要提前定义y
注意
宏替换时会把宏带入,同时会把参数的值带入
宏名和参数之间不能有空格。
形参不分配内存单元不需要定义类型。只是符号代换。
参数最好用小括号括起来。
举例使用有参宏求两个数最大值
#defineMAX(a,b) a>b?a:b
3) typedef 和define区别
都可以起别名
#define INT int *
tepydef int * INTER
宏使用的时候只是展开
INT a ,b ;//等效 int * a ,b;
INTER a ,b ;//等效与 int *a ;int* b;
4) 条件编译
根据不同的条件编译不同的程序部分,产生不同的目标文件。
条件编译指令
#if 常量表达式
程序段1
#elif
#endif
条件编译&代码调试打印日志
#ifdef 宏名
代码段
#else
代码段
#endif
检测是否定义了宏名
DEBUG这个宏系统已经定义 默认值为1
设置显示调试信息的宏
#define DEBUG== 1
#Log(format,…) printf(format,##__VA_ARGS__); //format 为形参 …表示参数可以为1个或者多个。##表示可以为0个参数。
#else
#Log(format,…); #endif
3 static和extern
static 和extern 都可以修饰变量。
static修饰的变量,内部变量,只有包含变量定义的源代码的文件都可以访问
extern修饰的变量,外部变量,所有的文件都可以访问,只要有声明就行。
static对局部变量作用: 延长局部的生命周期,但是没有改变作用域。变量不销毁
变量的声明只在第一次调用时执行。
extern 不能修饰局部变量。
static对全局变量的作用:全局变量只能在当前文件中使用。(内部变量)
extern 对全局变量的作用:可以在除自身文件之外的文件中使用。(外部变量)
与其他文件中的全局变量不能同名。
全局变量默认为外部变量。
static修饰函数 自能在自身文件中访问 (内部函数)
extern 修饰函数 可以在其他文件中使用。(外部函数)默认
可以通过调用外部函数,外部函数调用内部函数,实现不同文件之间的函数调用。
|