在c中使用#pragma pack但无法理解

时间:2012-07-29 15:08:27

标签: c

我使用#pragma指令编写了一个代码来对齐但我无法理解如何进行对齐。 我在ubuntu上使用gcc。

#include<stdio.h>

#define MALE 0;
#define FEMALE 1;
#define SINGLE 0;
#define MARRIED 1;
#pragma pack(3);

int main()
{
    struct emp
    {
        unsigned gender :1;
        unsigned mar:1;
        unsigned hobby:1;
        unsigned scheme :1;
    };
    struct emp e;
    e.gender=MALE;
    e.mar=SINGLE;
    e.hobby=1;
    e.scheme=1;
    printf("size of %d",sizeof(e));
    return 0;
}

当我使用#pragma pack为1时,大小为1,#pragma pack为2,大小为2,而3为4。

你能告诉我发生了什么吗?如果我不使用它仍然4来。

那么#pragma pack(1)#pragma pack(2)之间有什么区别?

3 个答案:

答案 0 :(得分:2)

3不是#pragma pack指令的有效参数。

有效值为124816,例如this page

答案 1 :(得分:0)

`#pragma'指令是C标准指定的方法,用于向编译器提供附加信息,超出语言本身传达的内容。

#pragma pack指定结构,联合和类成员的打包对齐方式。

有效值为1,2,4,8和16.成员的对齐将位于边界上,该边界是上述任何值的倍数或成员大小的倍数,以较小者为准更小

有关详细信息,请参阅MSDN pagehere

此外,有关here

下方结构包装的一些信息

什么是结构包装?

有时,必须避免在结构成员之间填充字节。例如,读取ELF文件头或BMP或JPEG文件头的内容。我们需要定义一个类似于标题布局的结构并映射它。但是,在访问这些成员时应该小心。通常逐字节读取是避免错位异常的选项。表现会受到打击。

大多数编译器提供非标准扩展来关闭默认填充,如pragma或命令行开关。有关更多详细信息,请参阅相应编译器的文档。

i want to know that when i write #pragma pack(1) it set first bits and atart second from next one what if i write #pragma(2) , whats the difference 

要回答这个问题,当您将#pragma设置为2时,如果驻留在结构中的数据少于2个字节,则它的对齐方式保持不变。但是,如果它超过2个字节(比如4个字节的整数),它将被拆分并以2个字节的边界对齐。

答案 2 :(得分:0)

#pragma pack(1)#pragma pack(2)之间的区别在于,在第一种情况下,您说您的结构可以从任何地址开始。

使用#pragma pack(2),您说起始地址必须可被2整除(偶数地址)。编译器通过这样做来说明结构的大小为2(通过用一些未使用的空格填充它)。

如果您创建一个emp数组,如emp a[10],则sizeof(emp)也是数组中每个元素之间的距离。这就是编译器将大小四舍五入到#pragma pack值的下一个倍数的原因。