typedef 用法

Posted by Kingback on May 3, 2016

最近看《C专家编程》的时候,看到了以前项目中遇到的一些陷阱,遗憾没有及时总结下来,彻底搞清楚,出来混,总是要还的。多总结,多思考,多写。

用途一:类型别名

定义一种类型的别名,不只是简单的宏定义,而且可以同时定义多个对象。

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量。宏定义亦不能这样。

以下则可行:

typedef char* PCHAR;
PCHAR pa, pb;

但不同于define的是,不能用其他类型说明符对其扩展,如下:

#define peach int
unsigned peach i; //没问题
typedef int banana;
unsigned banana i; //错误,非法

用途二:结构别名

struct my_tag
 {
    int x;
    int y; 
};

struct my_tag p1;

而在C++中,则可以直接写:结构名对象名,即:my_tag p1;

typedef struct my_tag //struct tag
{
    int x;
    int y;
}my_type; //struct type

struct my_tag p1;
my_type p2; // 这样就比原来少写了一个struct,比较省事,尤其在大量使用时

用途三:函数指针

  • 1.简单的函数指针的应用

    形式:返回类型(*函数名)(参数表)

int (*pf)(int);   
int g_Fun(int a){ return a*a;}   
void main()   
{
    pf = g_Fun;  
    cout << (*pf)(2); 
}
  • 2.使用typedef更直观更方便

    形式:typedef 返回类型(*新类型)(参数表)

typedef int (*pf)(int);   
pf pf_Fun;   
int gFun(int a){ return a*a;}   
void main()   
{   
    pf_Fun = gFun;   
    cou<<(*pf_Fun)(2);   
}
  • 3.代码示例如下:

#include <stdio.h>
#include <iostream>
#include <assert.h>

using namespace std;

//定义函数指针
typedef int (*pf_call)(int, int);

// +
int add(int a, int b)
{
    return a + b;
}

// -
int subtraction(int a, int b)
{
    return a - b;
}

// *
int multiplication(int a, int b)
{
    return a*b;
}

// /
int division(int a, int b)
{
    return b == 0 ? INT_MAX : a / b;
}

//定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、  
//返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址
pf_call func_call(char op)
{
    switch (op)
    {
    case '+':
        return add;
    case '-':
        return subtraction;
    case '*':
        return multiplication;
    case '/':
        return division;
    default:
        return NULL;
    }

    return NULL;
}


//s_calc_func为函数,它的参数是 op,     
//返回值为一个拥有两个int参数、返回类型为int的函数指针 
int(*s_calc_func(char op))(int, int)
{
    return func_call(op);
}


//最终用户直接调用的函数,该函数接收两个int整数,  
//和一个算术运算符,返回两数的运算结果  
int calc(int a, int b, char op)
{
    pf_call fp = func_call(op);

    int(*s_fp)(int, int) = s_calc_func(op);

    assert(fp == s_fp);

    if (fp)
        //下面两种方式都可,都是函数指针的方式
        //return (*fp)(a, b);
        return fp(a, b);
    else
        return INT_MIN;
}

int main()
{

    int a = 100, b = 0;

    printf("calc(%d, %d, %c) = %d \t\n", a, b, '+', calc(a, b, '+'));
    printf("calc(%d, %d, %c) = %d \t\n", a, b, '-', calc(a, b, '-'));
    printf("calc(%d, %d, %c) = %d \t\n", a, b, '*', calc(a, b, '*'));
    printf("calc(%d, %d, %c) = %d \t\n", a, b, '/', calc(a, b, '/'));

    system("pause");
    return 0;
}

参考资料

博客