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

源不兼容是否总是意味着二进制不兼容?

  •  3
  • anon  · 技术社区  · 15 年前

    欢迎使用任何示例来演示在维护二进制兼容性的情况下如何破坏源代码兼容性。

    3 回复  |  直到 13 年前
        1
  •  5
  •   bdonlan    15 年前

    旧版本:

    struct inner {
      int bar;
    }
    
    struct foo {
      struct inner i;
    };
    
    void quux(struct foo *p);
    

    新版本:

    struct inner2 {
      int bar;
    };
    
    struct foo {
      struct inner2 i;
    };
    
    void quux(struct foo *p);
    

    破译代码:

    struct foo x;
    struct inner *i = &x.i;
    i->bar = 42;
    quux(&x);
    

    由于唯一的区别是结构的名称,并且内部结构的类型名在编译期间被清除,因此没有二进制不兼容。

        2
  •  0
  •   Amber    15 年前

    不同机器上静态链接库的不同版本可能导致在机器A上编译的二进制文件在机器B上正常工作,但尝试从机器B上的源代码编译它失败。但除此之外,源不兼容通常意味着二进制不兼容。

        3
  •  0
  •   Promit    15 年前

    假设函数参数的类型在没有实际大小或基础类型更改的情况下发生更改(例如,从一个枚举更改为另一个枚举或从long更改为int)。这将破坏源代码,因为类型检查,但可能不会影响二进制兼容性。(取决于确切的环境,.NET会恼火,但是C/C++不会。)