我是靠谱客的博主 开心猫咪,最近开发中收集的这篇文章主要介绍C Tips: __attribute__((packed)),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天读某位大牛写的C源代码时,看到他在定义结构体时加了这样一个限定:__attribute__((packed))

代码片段如下:

struct cpuid {
	uint32_t eax;
	uint32_t ebx;
	uint32_t ecx;
	uint32_t edx;
} __attribute__((packed));
typedef struct cpuid cpuid_t;

这个“__attribute__((packed))”是什么意思呢?我查了查,具体查了哪些链接,请参考“参考链接”。我简单总结如下:


__attribute__((packed)) 是gcc的一个扩展,它等同于 #pragma pack(1)


它告诉gcc,当编译这个结构体时,如果发生字节不对齐的情况时,不进行任何填充。

也就是说,用它修饰的结构体定义,将不进行字节对齐操作。


这样做当然是很不安全的。正如 stackoverflow.com 上面有人说,在某些系统,例如SPARC上,这样做会导致程序崩溃。

如果你要使用  __attribute__((packed)) 这个扩展,你必须十分有把握,十分清楚自己在做什么,并对由此可能给程序带来的不安全因素负起责任来。


有人专门写了篇文章:《Why you shouldn’t use __attribute__((packed))》http://digitalvampire.org/blog/index.php/2006/07/31/why-you-shouldnt-use-__attribute__packed/


牢记:如果没有充分的理由和十足的把握,请不要用它。


参考链接:

  • What's this: __attribute__((packed)) http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe
  • #pragma pack http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.aix.doc/compiler_ref/pragma_pack.html
  • Why you shouldn’t use __attribute__((packed)) http://digitalvampire.org/blog/index.php/2006/07/31/why-you-shouldnt-use-__attribute__packed/


最后

以上就是开心猫咪为你收集整理的C Tips: __attribute__((packed))的全部内容,希望文章能够帮你解决C Tips: __attribute__((packed))所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部