免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6117 | 回复: 12
打印 上一主题 下一主题

[C++] 请教c++ 中typedef的用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-27 09:13 |只看该作者 |倒序浏览
1.typedef int (*a)[10]
2.typedef void (*p)()

3.
class a
{
...
}
typedef void(a::*p)()

能否详细说明一下typedef的各种用法

论坛徽章:
0
2 [报告]
发表于 2004-05-27 09:22 |只看该作者

请教c++ 中typedef的用法

掌握一点就可以了

比方说要定义一个变量xxx
void *(*xxx)(int *, char);

不要管xxx是个多么复杂的定义,
在xxx的地方用类型XXX_TYPE代替,前面加typedef
typedef void *(*XXX_TYPE)(int *, char);

这样不管什么时候要定义一个xxx,
只要写
XXX_TYPE xxx;
就可以了。

论坛徽章:
0
3 [报告]
发表于 2004-05-27 09:34 |只看该作者

请教c++ 中typedef的用法

比如说
typedef struct
{
...
} mystruct;
mystruct a_struct;//定义一个结构体

那么typedef void *(*XXX_TYPE)(int *, char);
是否表示用一个xxx_type指针代替一个无返回值,参数为一个int指针和char
的函数指针?

论坛徽章:
0
4 [报告]
发表于 2004-05-27 09:37 |只看该作者

请教c++ 中typedef的用法

原帖由 "eiik123456" 发表:
比如说
typedef struct
{
...
} mystruct;
mystruct a_struct;//定义一个结构体

那么typedef void *(*XXX_TYPE)(int *, char);
是否表示用一个xxx_type指针代替一个无返回值,参数为一个int指针和char
?.........


返回为void *类型的函数指针
luoting 该用户已被删除
5 [报告]
发表于 2004-05-27 11:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2004-05-27 11:28 |只看该作者

请教c++ 中typedef的用法

typedef使用大全1(数组)    eion(原作)  
  
关键字     typedef 数组
  


typedef到处都是,但是能够真正懂得typedef使用的不算太多。对于初学者而言,看别人的源码时对到处充斥的typedef往往不知所错,而参考书又很少,所以在此给出一个源码,供大家参考



#include <stdio.h>;

#include <iostream.h>;




/* 避免Visual C的for与标准for的不同 */

#define for  if (0);   else for



/* dim(a)是用于计算a的维数,不过只能计算数组的维数,不能计算指针的维数 */

#define dim(a) (sizeof(a)/sizeof(a[0]))



/* N1到N4是几个常量,以枚举的形式定义 */

enum {N1 = 2, N2 = 3, N3 = 4, N4 = 5};



/* 这个C程序员都知道,就是将DataType定义为int型,便于扩充 */

typedef int DataType;



/* 定义一个一维数组,数组的元素维整型值 */

typedef DataType ARR1[N4];



/* 再定义一个一维数组,数组的元素维ARR1型,不过ARR1又是一个数组,所以

* ARR2 实际上是一个矩阵

*/

typedef ARR1 ARR2[N3]; /* 此处完全等价为typedef int ARR2[N3][N4];*/



/* 按照ARR2的解释,ARR3也是一个一维数组,不过数组元素的类型是ARR2的类型

* 所有ARR3是一个三维数组

*/

typedef ARR2 ARR3[N2]; /* 此处完全等价为typedef int ARR3[N2][N3][N4];*/



/* 分别用定义好的ARR1,ARR2,ARR3定义三个变量a, b, c */

ARR1 a; /* 此处完全等价于:int a[N4]; */

ARR2 b; /* 此处完全等价于:int b[N3][N4]; */

ARR3 c; /* 此处完全等价于:int c[N2][N3][N4]; */



/* 下面函数给大家个示例看a,b,c如何使用 */

void exam_1()

{

    for (int i=0; i<dim(a); i++) a = i+1;



    for (int i=0; i<dim(b); i++) for (int j=0; j<dim(b[0]); j++)

        b[j] = (i+1)*10 + (j+1);



    for (int i=0; i<dim(c); i++) for (int j=0; j<dim(c[0]); j++)

        for (int k=0; k<dim(c[0][0]); k++) c[j][k] = (i+1)*100 + (j+1)*10 + (k+1);



    printf("\nThe a is :\n";

    for (int i=0; i<dim(a); i++) printf("%4d ", a);

    printf("\n";



    printf("\nThe b is :\n";

    for (int i=0; i<dim(b); i++)

    {

        for (int j=0; j<dim(b[0]); j++) printf("%4d ", b[j]);

        printf("\n";

    }



    printf("\nthe c is:\n";

    for (int i=0; i<dim(c); i++)

    {

        for (int j=0; j<dim(c[0]); j++)

        {

            for (int k=0; k<dim(c[0][0]); k++) printf("%4d ", c[j][k]);

            printf("\n";

        }

        printf("\n";

    }

}



/* 下面函数给大家演示数组在内存中的排列 */

void exam_2()

{

    int *pn = NULL;



    pn = (int *)a; /* 等价于 pn = &a[0]; */

    printf("\nThe a is :\n";

    for (int i=0; i<sizeof(a)/sizeof(DataType); i++) printf("%4d ", pn);

    printf("\n";



    pn = (int *)b; /* 等价于 pn = &b[0][0]; */

    printf("\nThe b is :\n";

    for (int i=0; i<sizeof(b)/sizeof(DataType); i++) printf("%4d ", pn);

    printf("\n");



    pn = (int *)c; /* 等价于 pn = &c[0][0][0]; */

    printf("\nThe c is :\n");

    for (int i=0; i<sizeof(c)/sizeof(DataType); i++) printf("%4d ", pn);

    printf("\n");

}







int main(int argc, char* argv[])

{

    exam_1();

    exam_2();

    return 0;

}

论坛徽章:
0
7 [报告]
发表于 2004-05-27 11:29 |只看该作者

请教c++ 中typedef的用法

typedef 使用大全2(结构体)    eion(原作)  
  
关键字     typedef 结构体
  
续 数组

#define S(s) printf("%s\n", #s); s

typedef struct _TS1{

    int x, y;

} TS1, *PTS1, ***PPPTS1;  // TS1是结构体的名称,PTS1是结构体指针的名称

// 也就是将结构体struct _TS1 命名为TS1,

// 将struct _TS1 * 命名为 PTS1

// 将struct _TS1 *** 命名为 PPPTS1

typedef struct { // struct后面的结构体说明也可以去掉

    int x, y;

} TS2, *PTS2;

typedef PTS1 *PPTS1; // 定义PPTS1是指向PTS1的指针


typedef struct _TTS1{

    typedef struct ITTS1 {

        int x, y;

    } iner;

    iner i;

    int x, y;

} TTS1;


//结构体内部的结构体也一样可以定义

typedef TTS1::ITTS1 ITS1;

void test_struct()

{

    // 基本结构体重定义的使用

    TS1 ts1 = {100, 200};

    PTS1 pts1 = &ts1; // 完全等价于TS1* pts1 = &ts1;

    PPTS1 ppts1 = &pts1; // 完全等价于TS1** ppts1 = &pts1;

    PPPTS1 pppts1 = &ppts1; // 完全等价于 TS1*** pppts1 = &ppts1;



    TS2 ts2 = {99, 88};

    PTS2 pts2 = &ts2;   // 完全等价于 TS2* pts2 = &ts2;



    TTS1 itts1 = {{110, 220}, 10, 20};

    Its1* rits1 = &itts1.i;

    ITS1* &its1 = rits1; // 等价于 TTS1::ITTS1 *its1 = &(itts1.i);



    printf("ts1\t = (%d, %d)\n*pts1\t = (%d, %d)\n"

           "**ppts1\t = (%d, %d)\n***pppts1= (%d, %d)\n\n",

            ts1.x, ts1.y, pts1->;x, pts1->;y,

            (**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

    printf("ts2\t = (%d, %d)\n*pts2\t = (%d, %d)\n\n",

        ts2.x, ts2.y, pts2->;x, pts2->;y);

    printf("itts1\t = [(%d, %d), %d, %d]\n*its1\t =  (%d, %d)\n\n",

        itts1.i.x, itts1.i.y, itts1.x, itts1.y, its1->;x, its1->;y);



    S(pts1->;x = 119);

    S(pts2->;y = 911);

    S(its1->;x = 999);



    printf("ts1\t = (%d, %d)\n*pts1\t = (%d, %d)\n"

           "**ppts1\t = (%d, %d)\n***pppts1= (%d, %d)\n\n",

            ts1.x, ts1.y, pts1->;x, pts1->;y,

            (**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

    printf("ts2\t = (%d, %d)\n*pts2\t = (%d, %d)\n\n",

        ts2.x, ts2.y, pts2->;x, pts2->;y);

    printf("itts1\t = [(%d, %d), %d, %d]\n*its1\t =  (%d, %d)\n\n",

        itts1.i.x, itts1.i.y, itts1.x, itts1.y, its1->;x, its1->;y);



    S((*ppts1)->;y = -9999);

    printf("ts1\t = (%d, %d)\n**ppts1\t = (%d, %d)\n\n",

        ts1.x, ts1.y, (*ppts1)->;x, (*ppts1)->;y);



    S((**pppts1)->;x = -12345);

    S((***pppts1).y = -67890);

    printf("ts1\t = (%d, %d)\n*pts1\t = (%d, %d)\n"

           "**ppts1\t = (%d, %d)\n***pppts1= (%d, %d)\n\n",

            ts1.x, ts1.y, pts1->;x, pts1->;y,

            (**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

}

论坛徽章:
0
8 [报告]
发表于 2004-05-27 11:32 |只看该作者

请教c++ 中typedef的用法

typedef使用大全3(指向函数的指针)    eion(原作)  
  
关键字     typedef 指向函数的指针
  
在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?

int (*s_calc_func(char op))(int, int);



如果不知道,请看下面的程序,里面有比较详细的说明




// 定义四个函数

int add(int, int);

int sub(int, int);

int mul(int, int);

int div(int, int);

// 定义指向这类函数的指针

typedef int (*FP_CALC)(int, int);



// 我先不介绍,大家能看懂下一行的内容吗?

int (*s_calc_func(char op))(int, int);



// 下一行的内容与上一行完全相同,

// 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针

FP_CALC calc_func(char op);



// 根据 op 返回相应的计算结果值

int calc(int a, int b, char op);



int add(int a, int b)

{

    return a + b;

}

int sub(int a, int b)

{

    return a - b;

}

int mul(int a, int b)

{

    return a * b;

}

int div(int a, int b)

{

    return b? a/b : -1;

}

// 这个函数的用途与下一个函数作业和调用方式的完全相同,

// 参数为op,而不是最后的两个整形

int (*s_calc_func(char op)) (int, int)

{

    return calc_func(op);

}



FP_CALC calc_func(char op)

{

    switch (op)

    {

    case '+': return add;

    case '-': return sub;

    case '*': return mul;

    case '/': return div;

    default:

        return NULL;

    }

    return NULL;

}

int calc(int a, int b, char op)

{

    FP_CALC fp = calc_func(op); // 下面是类似的直接定义指向函数指针变量

       // 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!

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

        // ASSERT(fp == s_fp);  // 可以断言这俩是相等的

    if (fp) return fp(a, b);

    else return -1;

}
void test_fun()

{

    int a = 100, b = 20;

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

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

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

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

}

运行结果

   calc(100, 20, +) = 120

   calc(100, 20, -) = 80

   calc(100, 20, *) = 2000

   calc(100, 20, /) = 5

论坛徽章:
0
9 [报告]
发表于 2004-05-27 15:31 |只看该作者

请教c++ 中typedef的用法

[quote]原帖由 "drowningfish"]typedef使用大全[/quote 发表:


狂说表象而不切中本质,
这样的文章分明就是谋害初学者,误人哪
(忍不住了要说,搞不好又会被人骂"程序员相轻")

论坛徽章:
0
10 [报告]
发表于 2004-05-27 15:46 |只看该作者

请教c++ 中typedef的用法

说真的越看越冷。怎么都看不懂了??达人能好好解释以下typedef吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP