我正在开发一个网络项目,我在我正在使用的框架代码中遇到了这个结构:
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中是不同的吗?
答案 0 :(得分:2)
在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_t
是在typedef
中定义的<stdint.h>
;同样uint16_t
。通常,这些名称用于提高可移植性。
请注意,即使没有必要,C ++也会允许typedef struct xxx xxx;
。
答案 1 :(得分:1)
1)属性打包是GCC特定声明(不是C标准的一部分)。这里描述:http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
此特定属性是编译器使用尽可能少的内存来存储所描述结构的对象的提示。
2)与C ++不同,在C中,如果没有typedef,则必须将给定结构的对象声明为:
struct sr_icmp_hdr mystruct;
答案 2 :(得分:0)
对于问题的最后一部分,C没有重载运算符用于输出,但你可以去:
hi hello = { 2, 1. };
printf("%d\n", hello.thisIsAnInt);