typedef有啥用?

Posted

技术标签:

【中文标题】typedef有啥用?【英文标题】:What is the use of typedef?typedef有什么用? 【发布时间】:2011-02-03 16:39:06 【问题描述】:

C 中 typedef 关键字有什么用? 什么时候需要?

【问题讨论】:

【参考方案1】:

来自***:

typedef 是 C 和 C++ 编程语言中的关键字。 typedef 的目的是为现有类型分配替代名称,通常是那些标准声明很麻烦、可能令人困惑或可能因一种实现而异于另一种实现的类型。

还有:

K&R 指出使用 typedef 有两个原因。首先,它提供了一种使程序更具可移植性的方法。不必更改程序源文件中出现的任何地方的类型,只需更改单个 typedef 语句。其次,typedef 可以使复杂的声明更容易理解。

还有一个反对意见:

他 (Greg K.H.) 认为,这种做法不仅会不必要地混淆代码,还会导致程序员意外误用大型结构,认为它们是简单类型。

【讨论】:

我完全同意 Greg K.H.在@T.J.Crowder 下查看我的评论。我认为这是不好的做法,应该尽量少用【参考方案2】:

typedef 用于将某物定义为类型。例如:

typedef struct 
  int a;
  int b;
 THINGY;

...将THINGY 定义为给定的结构。这样,您可以像这样使用它:

THINGY t;

...而不是:

struct _THINGY_STRUCT 
  int a;
  int b;
;

struct _THINGY_STRUCT t;

...这有点冗长。 typedefs 可以使一些东西戏剧性地更清晰,特别是指向函数的指针。

【讨论】:

那么有没有理由不typedefstruct @Panzercrisis:我不知道有一个,当然我在 1989-1998 年(我做大部分 C 工作的那几年)经常这样做,但我不是 C 专家(不再)。 但通常struct 的所有子类型都是typedefs 的简单类型,如shortdouble,有时是typedefs 的typedefs这会让您在各种.h 文件中进行一次兔子搜寻,到最后您已经忘记了它的用途,您必须为每个变量执行此操作。他们是一场噩梦!【参考方案3】:

它可以给其他类型起别名。

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */

【讨论】:

OP 询问为什么不怎么做【参考方案4】:

Typedef 用于为现有类型创建别名。这有点像misnomer:typedef 没有定义新类型,因为新类型可以与基础类型互换。当底层类型可能发生变化或不重要时,Typedef 通常用于接口定义中的清晰性和可移植性。

例如:

// Possibly useful in POSIX:
typedef int filedescriptor_t;

// Define a struct foo and then give it a typedef...
struct foo  int i; ;
typedef struct foo foo_t;

// ...or just define everything in one go.
typedef struct bar  int i;  bar_t;

// Typedef is very, very useful with function pointers:
typedef int (*CompareFunction)(char const *, char const *);
CompareFunction c = strcmp;

Typedef 也可以用来给未命名的类型命名。在这种情况下,typedef 将是该类型的唯一名称:

typedef struct  int i;  data_t;
typedef enum  YES, NO, FILE_NOT_FOUND  return_code_t;

命名约定不同。通常建议使用trailing_underscore_and_tCamelCase

【讨论】:

不推荐使用 _t 命名您自己的类型:***.com/a/231807/2985095【参考方案5】:

typedef 不引入新类型,而只是为类型提供新名称。

TYPEDEF 可用于:

    组合数组、结构、指针或函数的类型。

    为了便于移植,typedef你需要的类型。然后当你将代码移植到不同的平台时,通过只在typedef中进行更改来选择正确的类型。

    typedef 可以为复杂的类型转换提供一个简单的名称。

    typedef 也可用于为未命名类型命名。在这种情况下,typedef 将是该类型的唯一名称。

注意:-不应将TYPEDEF 与结构一起使用。即使不需要,也要在结构定义中使用标签。

【讨论】:

能否请您扩展一下不将 typedef 与结构一起使用?【参考方案6】:

来自***: “K&R 指出使用 typedef 有两个原因。第一……第二,typedef 可以使复杂的声明更容易理解。”

这是使用 typedef 的第二个原因的示例,简化复杂类型(复杂类型取自 K&R “The C programming language second edition p. 136”)。

char (*(*x())[])()

x是一个函数返回指向数组[]的指针,该指针指向返回char的函数。

我们可以使用 typedefs 使上述声明易于理解。请看下面的例子。

typedef char (*pfType)(); // pf is the type of pointer to function returning
                          // char
typedef pfType pArrType[2];  // pArr is the type of array of pointers to
                             // functions returning char

char charf()
 return('b');


pArrType pArr=charf,charf;
pfType *FinalF()     // f is a function returning pointer to array of
                     // pointer to function returning char

return(pArr);

【讨论】:

【参考方案7】:

在下面的例子中解释 typedef 的使用。此外,Typedef 用于使代码更具可读性。

#include <stdio.h>
#include <math.h>

/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/

// typedef a primitive data type
typedef double distance;

// typedef struct 
typedef struct
    int x;
    int y;
 point;

//typedef an array 
typedef point points[100]; 

points ps = 0; // ps is an array of 100 point 

// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)

// prototype a function     
distance findDistance(point, point);

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

    // delcare a function pointer 
    distanceFun_p func_p;

    // initialize the function pointer with a function address
    func_p = findDistance;

    // initialize two point variables 
    point p1 = 0,0 , p2 = 1,1;

    // call the function through the pointer
    distance d = func_p(p1,p2);

    printf("the distance is %f\n", d );

    return 0;


distance findDistance(point p1, point p2)

distance xdiff =  p1.x - p2.x;
distance ydiff =  p1.y - p2.y;

return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
 In front of everything, place the keyword typedef.
    */

【讨论】:

typedef'n 像double 这样的标准类型在阅读代码时只是令人困惑,它是结构体还是数组还是什么?然后,您必须寻找它的定义位置并记住可能有数百个标准类型的新名称,所有这些名称都可以以相同的方式命名。最后你需要知道底层类型是什么才能正确使用变量。 @CpILL,虽然我同意你所说的,但我认为你错过了重要的一点。想象一下,您正在编写一个网络堆栈,并且您想要一个数据结构(用 C 语言)来表示一个具有所有相关特征的节点。在这种情况下,将包含所有需要的变量的结构命名为“节点”非常方便。看看我是如何使用它的here 您将结构隐藏在typedef 后面,这正是我的观点!当你声明一个变量时,应该很明显它是什么类型,所以struct RBuf buff;rbuf_t buff; 更容易理解因为rbuf_t 到底是什么?人们必须四处寻找它,然后记住它才能使用您的代码。【参考方案8】:
typedef unsigned char BYTE;

在这个类型定义之后,标识符 BYTE 可以用作 unsigned char 类型的缩写,例如..

字节 b1, b2;

【讨论】:

OP 询问为什么不怎么做

以上是关于typedef有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体中struct和typedef struct有啥区别?

无法与 typedef 成为朋友:有啥特别的原因吗?

这些宏和 typedef 有啥作用?如何将其扩展到成员函数?

19-typedef

typedef 的使用

在程序中用typedef定义结构体