概述
今天读某位大牛写的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))所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复