在过去的几天里,我一直忙于做一些网络编程,我似乎无法弄清楚数据类型 u_int32_t abd bpf_u_int32 之间的区别。
u_int32_t 表示 32 个无符号位。bpf_u_int32 的意思不是一样吗?因为某些函数以一种或另一种形式读取 IP 地址。pcap 库中的某些函数(如 pcap_lookupnet)要求网络地址的格式为 bpf_u_int32。
我很想知道区别
程序员为了谋生而添加了间接层。它们几乎可以肯定是相同的类型,您可以在 C++ 中检查,#include <typeinfo>
后跟typeid(u_int32_t) == typeid(bpf_u_int32)
.
在某些实现中,至少有一种可能是unsigned int
,另一种是unsigned long
。
发生的事情是两个不同的人独立地为 32 位无符号类型选择了一个名称(或者可能是同一个人用于两个稍微不同的目的)。其中一个使用了“bpf”前缀,在这种情况下代表 Berkeley Packet Filter,因为它与数据包捕获有关。另一个没有。一个使用了_t
表示类型名称的后缀,另一个没有。除此之外,他们选择了相似的名字。
C99 和 C++11 都为 32 位无符号类型引入了标准名称:uint32_t
. 不过,这不会阻止人们为它创建自己的别名。
这两种类型最有可能是 32 位无符号类型的 typedef。因此,它们可以被认为是等效的,并且它们之间没有有用的区别。
始终从您真正使用的 bpf.h 文件中检查类型。这是一个 bpf.h:
#ifdef MSDOS /* 必须是 32 位 */
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
#别的
typedef int bpf_int32;
typedef u_int bpf_u_int32;
#万一