[英]What's the purpose of these `typedef`?
typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;
typedef intptr_t ngx_flag_t;
我们能从中受益什么?老实说,我想不出一个……
以上代码来自著名的 nginx 项目,有兴趣可以查看。
typedef 的目的之一是可移植性。 例如,不同的编译器和平台具有不同的类型大小,例如 x86、Linux、gcc 上的 sizeof(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
关键字。
它通常用于代码可移植性,并且与嵌入式系统特别相关。
假设您有一些 integer 值绝对必须是 32 位长。 也许他们需要 map 到网络/磁盘结构,也许他们需要保持那个数量级的值,或者其他什么。
现在,假设您在“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。
我知道两个原因:
原因可能是他们希望在移植代码时更改指针类型。 在另一个系统上,可能有不同的寻址模式(“银行”等),然后它们可能需要使用非标准语法,例如
typedef far intptr_t ngx_int_t;
如果他们从不将代码移植到同一系统上具有多个寻址模式的任何系统,那么指针的可移植性将永远不会成为问题,并且 typedef 将是多余的。
我看到人们这样做的原因之一是他们认为如果需要更改实际类型,他们只需要更改typedef
。 不过,我不太相信这个论点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.