define typedef用法

#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);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值