这些`typedef`的目的是什么?

时间:2011-05-26 09:13:36

标签: c typedef

typedef intptr_t        ngx_int_t; 
typedef uintptr_t       ngx_uint_t; 
typedef intptr_t        ngx_flag_t;

我们可以从中受益?我不能认为一个人诚实......

以上代码来自着名的nginx项目,如有兴趣请查看。

5 个答案:

答案 0 :(得分:1)

typedef目的之一是可移植性。例如。不同的编译器和平台具有各种类型的大小,例如x86上的sizeof(int),Linux,gcc与Texas Instrument的处理器不同:)但它仍然是int。

所以,

typedef int INT32 
移植代码时

保存一个。

typedef的另一个目的是声明类型以便进行更短的声明。

typedef sharted_ptr<MyClass> MyClassPtr;

现在,您可以使用MyClassPtr作为类型,而不是编写整个shared_ptr ...字符串。

typedef与结构的常见用法:

typedef struct {
   int x;
   int y;
} Point;

struct point {
   int x;
   int y;
}

typedef struct point Point;

两种typedef都可以避免每次都输入struct个关键字。

答案 1 :(得分:1)

它通常用于代码可移植性,并且与嵌入式系统特别相关。

假设你有一些绝对值必须是32位长的整数值。也许他们需要映射到网络/磁盘结构,也许他们需要保持那个数量级的值,或者其他什么。

现在,假设您在'int'为32位的编译器上开发代码。你写...

struct s {
 int a,b,c,d;
}

......它运作正常。但是,如果您需要切换到int只有16位但long为32的编译器,则需要将所有这些声明更改为

struct s {
 long a,b,c,d;
}

更糟糕的是,你不能只进行搜索/替换,因为有些“整体”你可能不关心它的大小。所以,最好的方法是:

typedef long INT32; // change this typedef according to compiler

struct s {
 INT32 a,b,c,d;
}

然后,您需要更改typedef。

答案 2 :(得分:0)

我知道两个原因:

  • 别名,将复杂的声明变得更简单
  • 可移植性,在不同的架构中,类型可能不同,只是一个非常简单的示例: u32 ,其中某些地方可以定义为 unsigned int ,其他< em> unsigned long 类型。

答案 3 :(得分:0)

原因可能是他们希望在移植代码时更改指针类型。在另一个系统上,可能有不同的寻址模式(“银行”等),然后他们可能需要使用非标准语法,如

typedef far intptr_t        ngx_int_t; 

如果他们从未将代码移植到同一系统上具有多个寻址模式的任何系统,则指针的可移植性永远不会成为问题,并且typedef将是多余的。

答案 4 :(得分:-1)

我看到人们这样做的原因之一是他们认为是否需要更改他们只需更改typedef的实际类型。不过,我对这个说法并不太满意。