gpt4 book ai didi

c - 难以理解 C 中的结构

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:06 24 4
gpt4 key购买 nike

我正在做一个网络项目,我在我正在使用的框架代码中遇到了这个结构:

struct sr_icmp_hdr {
uint8_t icmp_type;
uint8_t icmp_code;
uint16_t icmp_sum;
} __attribute__ ((packed)) ;
typedef struct sr_icmp_hdr sr_icmp_hdr_t;

有人可以解释结构后面的代码是什么吗?什么是 __attribute__typedef

我习惯在 C++ 中看到这个:

struct hi{
int thisIsAnInt;
double thisIsADouble;
}

并像这样声明一个结构:

hi hello;
cout << hello.thisIsAnInt;

这在 C 中有什么不同吗?

最佳答案

在 C++ 中,当您定义或声明一个类或结构时,标签名称会自动用作类型名称。

在 C 中,这不会发生,所以要获得与 C++ 中相同的效果,您必须添加:

typedef struct xxx xxx;

有些人喜欢将结构标记与类型名称分开,尽管它们位于不同的命名空间中,但没有必要。我几乎总是对标签和类型名称使用相同的名称,以强调它们指的是同一类型。

因此:

struct sr_icmp_hdr {
uint8_t icmp_type;
uint8_t icmp_code;
uint16_t icmp_sum;
} __attribute__ ((packed));

这定义了 struct sr_icmp_hdr ;属性是噪声。该属性不是 C 的标准化部分,而是在 GCC 中实现的。它确保结构中没有填充字节,尽管布局是这样的,只有不正当的编译器才会首先添加填充字节。因此,我将其描述为“噪音”。 (我用 C 编写代码已经有一段时间了,但没有理由使用它。显然,其他人有不同的经验,否则它不会出现在编译器中。)

typedef struct sr_icmp_hdr sr_icmp_hdr_t;

这定义了一个类型名称 sr_icmp_hdr_t那是 struct sr_icmp_hdr 的别名.更一般地说,typedef为类型引入一个替代名称。例如,uint8_ttypedef<stdint.h> 中定义在 C 中;同样uint16_t .通常,此类名称用于促进可移植性。

注意 C++ 允许 typedef struct xxx xxx;即使没有必要。

关于c - 难以理解 C 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com