1、宏定义:#
(1)包含的宏:#include 在预处理阶段,将包含的头文件加载进来
#include <xx.h> 在默认路径下查找
#include "xx.h" 现在当前路径下查找,如果没有再到默认路径下查找
(2)常量替换的宏:#define
#define MONTH 12将12用MONTH替换,常用于代码中重复出现12,若要修改成13或其他数字,只需将#define MONTH 13 就能实现批次修改
#define LED1 P1^1 将引脚p1.1用其他字符代替,方便理解
(3)条件编译的宏:
#if xxx if后面的条件成立,则执行if到else之间的代码
#else 否则执行else到endif之间得代码
#endif
#define xxxx
#ifdef xxxx 如果定义了宏xxxx,则执行ifdef到endif之间的代码
#endif
#ifndef xxxx 如果没有定义宏xxxx,则执行ifndef到endif之间的代码,常用于头文件,避免重复编译
#endif
(4)复合语句的宏(实现一些不太复杂的函数功能):
#define MAX(x,y) x>y?x:y求两数字最大值
#define MUL(X,Y) x*y求两数之积
2、静态修饰static:可以修饰变量和函数(在源文件中未用static修饰的全局变量和函数都是全局可见的,可以在其他文件中调用,也带来命名不可重复的问题)
(1)修饰变量
修饰全局变量时,该变量只能在本文件内使用,未初始化的static变量默认赋值为0
修饰局部变量时,这个变量只会初始化一次,以后用的值是上一次保存的值(函数调用结束后静态局部变量的内存空间保留)例如
int func(void)
{
int x=2;
x++;
return x;
}
int main(){
int y=0,i;
for(i=0;i<5;i++){
y+=func();
}
printf("%d\n",y);
return 0;
} //未用static修饰变量x时,输出结果为15,即每次调用函数func,x都会被重新赋值为2
int func(void)
{
staticint x=2;
x++;
return x;
}
int main(){
int y=0,i;
for(i=0;i<5;i++){
y+=func();
}
printf("%d\n",y);
return 0;
} //加了static关键字,输出结果为25,x的值只会被初始化一次,此后的值都会保留
(2)修饰函数:该函数只能在本文件内调用
3、extern(修饰变量或函数),表明该函数或变量在别的文件里定义
4、typedef(起别名)
(1)给复杂的定义赋予简单直白的别名
typedef unsigned char U8//不同数据类型的长度跟cpu的位数有关,解决不同cpu的代码通用问题,可以用typedef
typedef unsignedint U16
(2)用在结构体struct定义中,例如
typedef struct data{
int age;
char name[10];
}message; *mess
5、const(常量修饰符)
(1)常量指针:const int *p(int const *p) 例如
int x = 2 , y = 3;; //常用于函数的传参,不允许通过指针p来修改x的值,但x值可以通过其他方式来修改,同时p也可以指向其他的值
const int *p = &x;//即*p = y;是不允许的,但x = y;是可以的。
(2)指针常量:int *const p 例如
int x = 2 , y = 3; //指针p的值不可修改,是个常量,不可指向别的空间。但p指向空间的值可以修改
int *const p = &x;//即p = &y;是不允许的,但*p = y;是可以的。
(3)指针常量指针:const int *const p //指针p的值不可修改,同时不允许通过指针p来修改p指向空间的值
(4)修饰常量:const int x = 2;
//x的值不可直接被再次赋值,但可以通过指针来修改它的值
//即x = 3; 是不可以的,但通过int * p = &x; *p = 3; 是可以的