#define
只能通过简单的文本替换来实现而非传递参数;
#define MUL1(x) x * x
#define MUL2(x) (x) * (x)
MUL1(3) // 9
MUL1(3+2) // 3+2*3+2 = 11
MUL2(3) // 9
MUL2(3+2) // (3+2)*(3+2) = 25
例题
#define SUB(x,y) x-y
#define ACCESS_BEFORE(element,offset,value) *(SUB(&element, offset)) = value
void main_5()
{
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int i;
ACCESS_BEFORE(array[5], 4, 99);// *SUB(&array[5], 4) = 99
// * (&array[5] - 4) = 99
printf("array: ");
for (i = 0; i < 10; ++i) {
printf("%d", array[i]);
}
printf("\n");
输出:19934567890
typedef
用法1:
为基本数据类型定义新的类型名
typedef unsigned int uint8_t;
typedef char* p_CHAR;
uint8_t time;
p_CHAR pa, pb; // 定义两个char型指针,不同于char *pa, pb
用法2:为自定义数据类型定义新的名称
//
struct point{
int x;
int y;
};
typedef struct point Point;
//
typedef struct area{
int weight;
int hight;
}Area, *p_area; // 此处:Area* p_area
//
typedef struct {
string name;
int age;
}Person;
struct point my_point1 = {4, 5};
Point my_point2 = {6,7};
Area my_area1 = {2, 6};
Person my_person1 = {"mr-xuf", 24};
cout << "my_point1 x = " << my_point1.x << ", my_point1 y = " << my_point1.y <<endl;
cout << "my_point2 x = " << my_point2.x << ", my_point2 y = " << my_point2.y <<endl;
cout << "my_area1 weight = " << my_area1.weight << ", my_area1 hight = " << my_area1.hight <<endl;
cout << "my_person1 name = " << my_person1.name << ", my_person1 age = " << my_person1.age <<endl;
用法3:掩饰复合类型 即
定义
数组类型
/
数字组指针
类型
定义数组类型
typedef int arr_t[5];///定义了一个数组类型arr_t,该类型的变量是个数组
int main(void)
{
arr_t d; //d是个数组,这一行等价于: int d[5];
arr_t b1, b2, b3;//b1, b2, b3都是 包含5个元素的数组
d[0] = 1;
d[1] = 2;
d[4] = 134;
d[5] = 253;//编译警告:下标越界
}
定义数组指针类型
typedef int(*pArr_t)[5];//定义一个指针类型,该类型的指针可以指向含5个int元素的一维数组
int main(void)
{
int a[5] = {1,2,3,4,5};
int b[7] = {1,2,3,4,5,6,7};
pArr_t pA;//定义数组指针变量pA
pA= &a;//完全合法,无警告
pA= (pArr_t)&b;//类型强制转换为pArr_t,完全合法,无警告
}
用法4:掩饰复合类型 即
定义
函数类型
/
函数指针类型
定义函数类型
typedef int (my_f)(int, int);
int add(int a, int b){
cout << "add function...." << a + b << endl;
return a + b;
}
my_f *pp = add;
pp(7, 8);
定义函数指针类型
typedef int(*my_func)(int , int );// 声明指针my_func 指向int(*)(int, int)
int add(int a, int b){
cout << "add function...." << a + b << endl;
return a + b;
}
add(1, 3);// 直接调用
my_func my_func_add = add;
my_func_add(5, 6);
int (*p)(int , int);// 定义变量p 指向一个xxxx函数
p = &add;
p(1, 5);