代码之家  ›  专栏  ›  技术社区  ›  solotim

当替换旧库时,为什么不能减小结构的大小?

  •  0
  • solotim  · 技术社区  · 16 年前

    当我们编写一个新版本的我们制作的库(在C语言中)时,我们被禁止改变结构的大小,比如说更小。为什么?

    明确地,

    版本1包含:

    struct foo {
        int a;
        int b;
    }
    

    版本2包含:

    struct foo {
        char a;
        char b;
    }
    

    并将结构定义与声明分离,使库用户不能访问该结构的成员。

    2 回复  |  直到 16 年前
        1
  •  3
  •   AndersK    16 年前

    很难猜测,因为可能有一些或多或少有效的原因,可能都与尝试向后兼容以及在进行更新时避免更新所有程序有关。

    结构可以以多种方式(AB)使用,例如,人们可以在结构内部具有指向的指针,而不是通过名称访问结构成员,可以使用指针四处走动:

    struct {
      int a;
      int b;
      int c;
    } s;
    

    如果有人用

    struct s mys;
    ... 
    int *p = &mys.a; ++p; ++p; *p = 3;
    

    如果结构变小,它将断开

    作为一个例子,Windows(以其向后兼容性头痛的悠久历史而闻名)通常具有结构的大小作为结构中的第一个成员,然后应用程序将首先读取该值来猜测它们使用的结构版本,这当然意味着将有许多与不同版本对应的、类似名称的结构取决于大小(颤抖)。

    当然,它还不足以保持向后兼容性,但它有帮助。

        2
  •  2
  •   RCIX    16 年前

    基本原因是(我不是这里的C程序员,但我对我的答案相当有信心),它将是一个 突破变化 .

    破坏更改意味着这将是一个需要库使用者修改其代码的更改,这永远不是一件好事。这意味着,如果他们想使用你的库的最新版本,他们就必须发布他们程序的新版本,这可能并不总是可行的。