代码之家  ›  专栏  ›  技术社区  ›  Anish Ramaswamy

如何维护地确定(结构…)的大小?

  •  1
  • Anish Ramaswamy  · 技术社区  · 13 年前

    假设我有一个结构:

    struct myStruct
    {
        int a;
        short b;
        char c;
    };
    

    在Windows中, MSDN states that int 占用4个字节, short 占用2个字节 char 占用1个字节。这一共有7个字节。

    据我所知,大多数编译器都会用未指定数量的字节填充结构,以提高对齐性。所以,当我执行这个程序时,

    #include <stdio.h>
    
    int main(void) {
        printf("%d\n", sizeof(struct myStruct));
        return 0;
    }
    

    我得到的输出 8 。这意味着填充了1个字节。

    有什么办法可以让我持续地确定 struct 代码中的大小(不包括单个大小的总和 sizeof s) ?

    我问这个问题是因为后来,如果我需要改变我的结构,增加大约十五个元素,如果我再增加五个结构,我所有的 结构 尺寸 s会改变,导致事情变得一团糟。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Alexey Frunze    13 年前

    您可以强制执行:

    #define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]
    
    C_ASSERT(sizeof(struct myStruct) == 7); // or 8, whichever you want
    

    每当大小偏离7时,代码就会简单地停止编译。

    可以执行类似的操作来强制执行结构杆件的偏移。你需要 offsetof() 宏。

        2
  •  0
  •   abasu    13 年前

    你可以试试pragma pack。它有助于保持一致性,并具有许多灵活性。检查这个 http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.aix.doc/compiler_ref/pragma_pack.html

    更新:刚才看到你的评论,也许pack当时不是你的解决方案