- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做一个网络项目,我在我正在使用的框架代码中遇到了这个结构:
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_t
是 typedef
在 <stdint.h>
中定义在 C 中;同样uint16_t
.通常,此类名称用于促进可移植性。
注意 C++ 允许 typedef struct xxx xxx;
即使没有必要。
关于c - 难以理解 C 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108384/
我想模拟这个函数: function getMetaData(key) { var deferred = $q.defer(); var s3 = vm.ini
我是一名优秀的程序员,十分优秀!